C语言学习:C语言编译后的内存分布。
C语言编译后的内存分布。
C语言经过编译后将内存分为以下几个区域:栈、堆、全局(静态)存储区、文字常量区和程序代码区。
栈:由编译器进行管理,自动分配和释放,用于存放函数调用过程中的各种参数、局部变量、返回值以及函数的返回地址。
(操作方式类似于数据结构中的栈。)
//例: void fun(int num)//函数参数num { int n = num;//局部变量n return n; // 返回值n }
堆:用于程序动态申请分配和释放空间。
(C中的malloc()和free(),C++中的new和delete均是在堆中进行的。)
一般情况下,程序员在编写程序时应该将申请的空间在使用后释放,若没有主动释放空间,则在程序运行结束时系统自动回收释放。
//在堆中进行 int *p = (int *)molloc(sizeof(int)); 申请一块大小和int类型大小相同的内存(),将地址转换为int *型, 然后放在p中 malloc()函数的作用是分配制定字节数的空间, 返回默认为void 类型的指针指向开辟空间的首地址 sizeof()为单目运算 求出对应类型所占用的字节数 (类型名)为单目运算 为强制类型转换 要注意的是 malloce函数申请得到的空间是无类型的空间 必须强制转换成对应指针可以指向的空间的类型 这里定义的是int *p 所以p指针只能指向int型空间 sizeof(int) 求得int类型所占的字节数(4个字节) 等同于sizeof(4) malloc(sizeof(int)) 申请一个跟int所占的空间大小一样的空间 (int*)malloc(sizeof(int)) 将申请得到的空间地址转换成了int类型空间地址 最后就可以赋值给指向int型空间的p指针了。
全局(静态)存储区:分为DATA段和BSS段,该区域的生命周期为整个程序,即从程序第一行开始到main函数结束。
该区域在程序运行结束时,自动释放内存空间。
DATA段(全局初始化区):存放初始化后的全局变量和静态变量。
BSS段(全局未初始化区):存放未初始化的全局变量和静态变量。
int a = 0;//存储于DATA段 int b;//存储于BSS段
注:BSS段在程序执行前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。
(上述程序在编译后a和b的值均为0。)
文字常量区:存放常量字符串。程序结束后由系统释放。
int main() { char *p = "abcdefg"; //abcdefg/0在文字常量区,p在栈上 }
程序代码区:用于存放程序的二进制代码。
最后引用一张图来体现各个部分的实际存储位置。