一个C程序运行时的内存分配情况

时间:2022-12-25 08:04:32

C语言的内存分配模型

1、程序代码区:存放函数体的二进制代码。  

2、全局区数据区:全局数据区划分为三个区域。全局变量和静态变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。常量数据存放在另一个区域里。这些数据在程序结束后由系统释放。我们所说的BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。

3、栈区:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

4、堆区:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式类似于链表。

5、命令行参数区:存放命令行参数和环境变量的值。



//test.c
int g_var_a=0; //存放在全局已初始化数据区
char g_var_b; //存放在BSS区(未初始化全局变量)
int main()
{
int var_a; //存放在栈区
char var_str[]="string1"; //存放在栈区
char *p_str1,*p_str2; //存放在栈区
char *p_str3="string2"; //存放在已初始化数据区,prt_str3存放在栈区
static int var_b=100; //全局静态数据,存放在已初始化区

p_str1=(char*)malloc(1024); //从堆区分配1024B内存
p_str2=(char*)malloc(2048); //从堆区分配1024B内存
free(p_str1);
free(p_str2);

return(0);
}

//main.cpp	
int a = 0; //全局初始化区
char *p1; //全局未初始化区

main()
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\\0在常量区,p3在栈上。
static int c =0;//全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}