c语言学费,C语言收费吗
Yyds干货库存
@[目录]
动态内存打开malloc只是从内存池中抽取一个合适的内存,不会初始化。如果需要初始化,可以手动或使用calloc函数。
动态开放空间,2种回收方式
活动释放器结束空指针的取消引用。
if(p==NULL){ printf( error );返回;}对于内存越界访问动态打开的空间,使用free释放非动态打开的空间,使用free释放一部分动态内存。如果多次忘记释放同一块中动态打开的空间,就会造成内存泄漏。手动将P设置为null p=NULL例子
Void GetMemory2(char **p,int num){ * p=(char *)malloc(num);} void Test(void){ char * str=NULL;GetMemory( str,100);strcpy(str, hello );printf(str);}还差免费(str);str=NULLvoid Test(void){ char * str=(char *)malloc(100);strcpy(str,“hello”);免费(str);if(str!=NULL){strcpy(str," world ");printf(str);} }//内存访问错误,因为是免费的。虽然没有消失,但是找不到内存地址,没有访问权限;如果还是会输入,因为上面的例子都是从《高质量的C/C++编程》,因为没有手工空白。
Realloc扩容功能:将原内存的内容复制到新的内存中,这样旧内存的指针就不能再用了,可以用realloc返回的新指针来代替。
在返回函数中,return只能返回堆上的内存,比如malloc请求的堆内存,char p[]= hello world ;返回p;//错误
示例:
int * p(void){ int x=10;Return (}存储大数据端和小数据端
improve # includesdio . h int main(){//unsigned char 0-255 unsigned char a=200;//000000000000000000000000011001000-char类型占用一个字节8位//11001000无符号char b=100//00000000000000000000000001100100//01100100无符号char c=0;//a和B塑料吸头//0000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 0000 00 000 000 000 000 00 00000 00 00 0000 00 000 00 00 0000 00 0000 00 00 000 0//300 44返回0;} file #include文件名到系统提供的指定路径,并找到文件。如果找不到,就会报错。
#include filename首先在当前路径查找文件。如果找不到,执行#include filename的过程。如果找不到,则报告错误。
如果找到了该文件,请将该文件的内容复制并粘贴到#include预处理指令出现的位置。
指定的系统路径位于:
Gcc -E测试. c -o测试. I-v #包括.搜索从这里开始:
#包括.搜索从这里开始:
/usr/lib/gcc/x86 _ 64-red hat-Linux/4 . 8 . 5/include
/usr/本地/包含
/usr/include
搜索列表结束。
蓝色部分是系统指定的路径,可以通过cd /usr/include查看。
错误0:标准输入
1:标准输出
2:标准误差输出
“”表示重定向,2表示标准误输出的通道,所以1 ^ 2表示标准误输出重定向到标准误输出的通道;
1 ^ 2意味着标准输出被重定向到文件名为2的文件。
编译过程1。预处理:对源文件进行预处理,生成预处理文件。预处理CPP是根据预处理指令中包含的文件内容(如#include、#define等)插入到程序中的。).
Gcc -E test.c -o test.i//可以查看编译过程,使用vimtest.i,最后一个是详细过程printf(ARE=%.2f\n ,ARE(3 ^ 2));==printf(ARE=%.2f\n ,3.14 *(3 ^ 2)*(3 ^ 2));2.编译:根据预处理文件,编译成汇编语言,调用汇编程序生成汇编代码(。s文件)。
Gcc -S test.s -o test.o3汇编:调用汇编程序,翻译成机器语言,生成目标文件(。o文件)。
Gcc -c test.s -o test.o4链接:将test.o与运行时文件和库函数链接,调用连接器,将程序中使用的函数添加到程序中,生成可执行文件。
Gcc test.o -o test预编译注释一般保存在预处理文件中,用#if 0.其他.#endif。
预编译也称为预处理。预编译不是编译,而是编译前的处理。该操作在正式编制* *前由系统自动完成。预编译也称为预处理。预编译不是编译,而是编译前的处理。该操作在正式编制前由系统自动完成。
#define定义预处理宏。
#undef取消定义宏定义。
#if在预处理中编译条件命令,相当于C语法中的if语句。
#ifdef确定是否定义了宏,如果是,则执行下面的语句。
与#ifdef相反,#ifndef确定宏是否未定义。
#elif如果不满足#if、#ifdef、#ifndef或前面的#elif条件,将执行#elif之后的语句,相当于C语法中的else-if。
#else #if,#ifdef,#ifndef,如果不满足这些条件,将执行#else之后的语句,相当于C语法中的else。
#endif #if、#ifdef、#ifndef是这些条件命令的结束符号。
Defined与#if和# if、#elif一起用于确定宏是否已定义。
区分define和typedef应该使用typedef而不是#define来创建新类型,因为后者无法正确处理指针类型。
#define pro_char char *pro_char a,b;//A声明正确,但B用字符声明。对于没有具体类型的操作,没有具体类型就不能取消引用。
内存储器
变量的生命周期是从变量地址空间的分配到变量地址空间的释放。
程序是静态存储在磁盘上的文件。程序是指令的集合。如果程序不运行,就无从谈起变量地址空间的分配。
程序的运行进程对计算机资源使用情况的描述就是进程。每次运行同一个进程,都是一个进程。当我们输入。/executable文件,程序开始运行。
程序的运行分为加载和执行两个阶段。程序首先被加载到一个特定的地址空间,比如全局变量、静态局部变量和函数…,我们称之为程序的符号。程序的具体地址已经在加载阶段分配好了。我们称这样的存储区域为静态存储区域。
程序加载后,找到主函数,然后开始执行程序。在程序执行阶段,当遇到定义自动局部变量的语句时,系统自动为这些自动局部变量分配空间,局部变量就诞生了。这些局部变量所在的区域称为动态存储区。这些变量的地址由系统自动分配,当函数的复合语句结束时,它们的地址空间自动释放。所以叫静态分配。还有一种方式,在程序执行过程中,程序所需的地址空间大小是不确定的,需要程序员根据实际情况向系统申请。这样分配的地址空间称为动态分配。
程序执行时,需要将可执行程序加载到内存中,CPU从内存中读取程序指令。
类型:先通过变量的名字找到变量的地址,然后根据其类型访问地址空间中的内容。
静态修改局部变量:局部变量的生命周期变长。
修改全局变量:改变变量的作用域,使静态全局变量只能在自己的源文件内部使用,源文件出来后不能再次使用。
修改函数:改变了函数的链接属性。
外部链接属性-内部链接属性
# include stdio . h void cout(void){ int I=0;printf(cout i=%d\n ,I);返回;}//静态变量在编译值中被赋一次初始值,而自动变量在调用函数时被赋一次初始值,初始值void cout _ c(void){ Static int I=0;//静态局部变量printf(cout i=%d\n ,I);返回;} int main(){ int I;for(I=0;I I)cout();for(I=0;I I)cout _ c();返回0;}/*运行结果:cout I=0 couti=0 couti=0 couti=0 couti=0 couti=2 couti=3 couti=4。在count函数中,变量I是一个自动局部变量。当函数count被调用时,地址空间被分配给它。
并把初始值设为0,然后输出的值,再把I的值递增,然后函数调用后,变量I的地址空间就到站了。
所以当你再次调用它的时候,给它赋值,…
所以输出总是0。countc函数中的静态局部变量在程序加载和执行之前就已经确定了它的地址空间。
并将其初始值设置为0。调用这个函数时,先输出I的值为0,然后递增I,I的值变成1,函数调用结束。
函数中自动局部变量的地址空间被释放,静态局部变量的地址空间没有被释放,所以再次调用函数时,I的值为1,然后递增。
直到整个程序结束,静态局部变量I的值才被释放。
静态存储和动态变量的异同* *:相同:都需要分配内存。
不同:静态变量由系统自动分配和释放。程序员不能在程序运行的过程中手动分配和释放,静态变量是在堆栈中分配的。
动态变量由程序员手动分配和释放。程序员可以在程序运行过程中手动分配和释放它们。他们可以在函数执行过程中的任何时刻手动释放动态变量的空间,而不需要等待函数终止。静态变量在堆(链表)中分配。
程序的操作分为两步:
1.Load,将程序从硬盘加载到地址空间。
2.执行,找到主函数,开始执行。
在程序执行之前,地址空间的变量或常数已经被分配并存储在静态存储器中。
程序在运行过程中一直存在。
程序执行过程中,执行语句时,将地址空间分配给变量,变量存储在动态存储区,由系统自动管理。
Satic声明后是内部的,只在源文件中使用,不允许调用内部函数。
Extern扩展了变量的范围
存储模式被分配给它,…
所以输出总是0。countc函数中的静态局部变量在程序加载和执行之前就已经确定了它的地址空间。
并将其初始值设置为0。调用这个函数时,先输出I的值为0,然后递增I,I的值变成1,函数调用结束。
函数中自动局部变量的地址空间被释放,静态局部变量的地址空间没有被释放,所以再次调用函数时,I的值为1,然后递增。
直到整个程序结束,静态局部变量I的值才被释放。
静态存储和动态变量的异同* *:相同:都需要分配内存。
不同:静态变量由系统自动分配和释放。程序员不能在程序运行的过程中手动分配和释放,静态变量是在堆栈中分配的。
动态变量由程序员手动分配和释放。程序员可以在程序运行过程中手动分配和释放它们。他们可以在函数执行过程中的任何时刻手动释放动态变量的空间,而不需要等待函数终止。静态变量在堆(链表)中分配。
程序的操作分为两步:
1.Load,将程序从硬盘加载到地址空间。
2.执行,找到主函数,开始执行。
在程序执行之前,地址空间的变量或常数已经被分配并存储在静态存储器中。
程序在运行过程中一直存在。
程序执行过程中,执行语句时,将地址空间分配给变量,变量存储在动态存储区,由系统自动管理。
Satic声明后是内部的,只在源文件中使用,不允许调用内部函数。
Extern扩展了变量的范围
存储模式
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。