概述
C程序的存储空间布局
- 一、C程序在内存空间的组成部分
- 1.正文段
- 2.初始化数据段(静态存储区域)
- 3.非初始化数据段(静态存储区域)
- 4.栈
- 5.堆
- 二、图示
- 三、实例
一、C程序在内存空间的组成部分
1.正文段
CPU执行的机器指令部分,因为他是共享的,所以在内存中一般只需存在一个副本。(只读)
2.初始化数据段(静态存储区域)
任何在函数之外声明的已赋值的变量。(比如已赋值的全局变量)
int a=0;
3.非初始化数据段(静态存储区域)
任何在函数之外声明的尚未赋值的变量。(比如未赋值的全局变量)
int a;
4.栈
栈一般是由编译器自动分配和释放的,运行效率很高,但内存容量有限。一般包括执行函数时的局部变量、每次函数调用时所需保存的信息。(比如main函数里的局部变量)
5.堆
堆中一般进行动态内存分配,需要手动申请和释放,较为灵活,用完必须释放,否则会导致内存泄漏、段错误等。例如:malloc、free等函数申请的动态内存。
二、图示
三、实例
代码如下(示例):
#include <stdio.h>
#include <malloc.h>
int main(void)
{
/*在栈上分配*/
int i1=0;
int i2=0;
int i3=0;
int i4=0;
printf("栈:向下n");
printf("i1=0x%08xn",&i1);
printf("i2=0x%08xn",&i2);
printf("i3=0x%08xn",&i3);
printf("i4=0x%08xnn",&i4);
printf("--------------------nn");
/*在堆上分配*/
char *p1 = (char *)malloc(4);
char *p2 = (char *)malloc(4);
char *p3 = (char *)malloc(4);
char *p4 = (char *)malloc(4);
printf("p1=0x%08xn",p1);
printf("p2=0x%08xn",p2);
printf("p3=0x%08xn",p3);
printf("p4=0x%08xn",p4);
printf("堆:向上nn");
/*释放堆内存*/
free(p1);
p1=NULL;
free(p2);
p2=NULL;
free(p3);
p3=NULL;
free(p4);
p4=NULL;
return 0;
}
该示例代码主要演示了在内存分配中的堆和栈的区别,其运行结果为:
栈:向下
i1=0x0060fefc
i2=0x0060fef8
i3=0x0060fef4
i4=0x0060fef0
p1=0x00bd14e0
p2=0x00bd3148
p3=0x00bd3158
p4=0x00bd3168
堆:向上
引用
Richardstevens W , Rago S , 拉戈, et al. UNIX环境高级编程[M]. 人民邮电出版社, 2014.
(作者未知)http://c.biancheng.net/c/stack/
最后
以上就是欢呼火为你收集整理的C程序的存储空间布局一、C程序在内存空间的组成部分二、图示三、实例的全部内容,希望文章能够帮你解决C程序的存储空间布局一、C程序在内存空间的组成部分二、图示三、实例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复