C语言–内存分区
关于内存分区,可以从五个方面考虑:
- 堆区:可以由编程人员手动分配和释放,分配方式类似于链表。由malloc分配,free释放。如果编程人员忘记释放,程序结束系统自动释放;
- 栈区:由编译器自动分配和释放,例如,局部变量、函数形参等;
- 全局(静态)存储区:存放全局变量和静态变量。包括DATA段和BSS段,
¥¥DATA段:全局初始化区,存放初始化的变量;
¥¥BSS段:全局未初始化区,存放未初始化的变量;
其中BSS特点:在程序执行之前,未初始化变量已经是0了。 - 文字常量区:存放常量字符串,程序结束后自动释放;
- 程序代码区:存放函数体的二进制代码。
用下面程序加深理解:
#include<stdio.h>
int k = 2;
int main()
{
int i = 1;
char* j;
static int m = 1;
char *n = "hello word";
j = (char*)malloc(2);
free(j);
printf("栈区地址为:0x%x\n",&i);
printf("堆区地址为:0x%x\n", j);
printf("全局变量地址为:0x%x\n", &k);
printf("静态变量地址为:0x%x\n", &m);
printf("文字常量地址为:0x%x\n", &n);
printf("程序区地址为:0x%x\n", &main);
return 0;
}
对于程序区,只需对函数名取地址就可以了。
在运行环境下,结果如下:
《完》