您现在的位置是:首页 >学无止境 >【c语言】五大内存区域 | 堆区详解网站首页学无止境

【c语言】五大内存区域 | 堆区详解

天喜Studio 2023-06-25 20:00:02
简介【c语言】五大内存区域 | 堆区详解

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

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
",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
", *p);
	printf("%d
", *p);
	printf("%d
", *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   栈区自动创建回收不会产生碎片
    (不释放的安全隐患,占用内存空间导致程序不能正常运行)

 

大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容! 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。