创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言系列专栏: c语言之路重点知识整合
相关知识点:c语言全局变量、局部变量详解
目录
内存区域分为:
栈区:
堆区:
堆区和栈区的区别
内存区域分为:
代码区code zone、常数区constant zone、全局变量区global zone、栈区stack zone、堆区heap zone。
例:
#include <stdio.h>
int sum(int a,int b) //sum 代码区 a b栈区
{
static int c; //c 全局变量区
c=a+b;
return c;
}
int q; //q全局变量区
int main ()
{
printf("%d\n",sum(1,2)); // 1 2常数区
return 0; // 0 常数区
}
1 代码区用来存放函数{ }内流程结构中的代码
2 常数区存放不可改变的常数
3 全局变量区存放全局变量和静态变量
4 栈区存放局部变量
5 堆区存放大量的数据
栈区:
对于栈区中的局部变量,函数调用才进行创建,函数执行完就会被自动回收
例:
调用完函数再打印其中的局部变量:
#include <stdio.h>
int* func()
{
int a;
a = 10;
return &a;
}
int main()
{
/*栈区*/
int* p = func();
printf("%d\n", *p);
printf("%d\n", *p);
printf("%d\n", *p);
return 0;
}
堆区:
如果栈区内的局部变量不想被自动回收,持续有效,就可以手动使用malloc将堆区创建一个存储空间并把局部变量存放进去,该数据如果不被手动回收,就会一直存放在堆区中。
#include <stdio.h>
#include <malloc.h>
int* func()
{
int a;
a = 10;
return &a;
}
int main()
{
int* m = malloc(sizeof(int)); //一个数据 申请4字节的空间
int* mm = malloc(sizeof(int) * 5); //5个数据
*m = 9; //利用*p对堆空间进行数据存取
mm[3] = 5; //数组方式
free(m);
free(mm); //释放堆内存
m = NULL; //指向空指针
mm = NULL;
(calloc同样分配堆空间,只是赋予初始值为0,malloc不会被初始化,值是未知的)
堆区和栈区的区别
1.分配方式不同:堆区只有在遇到malloc才会创建 栈区在函数调用全部创建完
2.栈区:临时性、少量的数据 堆区:持续的、大量的数据
3.管理方式不同:栈区自动 堆区手动
4.堆区分配的空间更大
5.都是延伸性增长,方向不同
6.堆区容易产生碎片 free 栈区自动创建回收不会产生碎片
(不释放的安全隐患,占用内存空间导致程序不能正常运行)