中山网站建设方案外包,磁力链接搜索引擎2021,山东省城乡住房和建设厅网站,凡客诚品的经营特色#x1f525;个人主页#xff1a;北辰水墨
#x1f525;专栏#xff1a;C学习仓 本节我们来讲解C/C的内存区域划分#xff0c;文末会附加一道题目来检验成果#xff08;有参考答案#xff09; 一、大体有哪些区域#xff1f;分别存放什么变量开辟的空间#xff1f;
… 个人主页北辰水墨
专栏C学习仓 本节我们来讲解C/C的内存区域划分文末会附加一道题目来检验成果有参考答案 一、大体有哪些区域分别存放什么变量开辟的空间
栈区局部变量函数的参数
堆区动态分配的内存
静态区静态变量全局变量
常量区数字常量字符串常量
代码区被编译后的程序代码二进制代码 二、各个区域的特性
栈区 在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元会自动释放。栈内存分配运算内置于处理器的指令集中效率很高但是分配的内存空间有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
堆区 堆区一般存储的是动态内存如由malloc,calloc,realloc动态开辟的空间。这些空间一般由程序员分配释放若不释放程序结束时可能由OS回收但若程序没有结束则会造成内存泄漏因此动态开辟的空间一定要记得free释放。内存分配的方式类似于链表。
静态区 static存放全局变量、静态数据。程序结束后不是函数结束由系统释放。
常量区 存放数字常量字符串常量。
代码区 被编译后的程序代码二进制代码。 三、如何区分变量开辟的空间是那个区域
在它定义的时候 1.是局部变量还是全局变量。 2.有没有static关键字。 3.有没有malloc函数在堆区空间开辟空间。 4.是不是常量。 四、区分变量和变量名 上面提到的变量下面的题目我也是直接叫变量了开辟的空间存在哪个区域 变量名存储在编译器的内存中而不是程序运行时的五大区域中。 编译器会根据程序中定义的变量、函数和其他标识符的信息构建符号表并将其保存在内存
中以便后续的编译和链接操作使用。 符号表在编译连接时会通过这个符号表将相应的变量名函数名都映射成对应的地址 五、请听题 int globalvar 1;
int staticGlobalVar 1;
int main()
{static int staticVar 1;int localVar 1;int num1[10] { 1,2,3,4 };char char2[] abcd;const char* pChar3 abcd;int* ptr1 (int*)malloc(sizeof(int) * 4);int* ptr2 (int*)calloc(4, sizeof(int));int* ptr3 (int*)realloc(ptr2, sizeof(int));free(ptr1);free(ptr2);free(ptr3);return 0;
} 1选择题
下面的变量在内存的哪个区域
选项A、栈区 B、堆区 C、静态区 D、常量区
① globalvar___ staticGloalVar___ staticVar___
② localVar___ num1___ ③ char2___ *char2___
④ pChar3___ *pChar3___
⑤ ptr1___ *ptr1___ 2答案① C C C ② A A ③ A A ④ A D ⑤ A B 3解析
①静态变量和全局变量 存放在 静态区
②局部变量 存放在 栈区。num1也是一个局部的变量在栈区开辟了一块数组
③char2是一个局部变量 *char2解引用表示它指向的那一块数组的首元素而数组的首元素存储在栈区中这里你们一定有疑惑为什么字符串存储在栈区。其实不然这里表示的char类型的数组会在栈区开辟5个字节的空间然后把在常量区的字符串“abcd\0”拷贝到数组中。
所以*char指向的数组是在栈区。
④pChar3也是一个局部变量在栈区。 *pChar3指向的是常量区的字符串“abcd\0”所以*pChar3表示字符串的首元素aa是存放在常量 区的。
⑤ptr1也是一个局部变量存放在栈区。它指向的是一块堆区的内存块。 *ptr1是对ptr1指针解引用就是堆区的那一块空间。 这么说你们肯定还是发蒙那我画个图来带你们理解、