C语言存储格式

引入:

在C程序中我们定义变量,定义函数,写的逻辑语句,用malloc()函数申请的neic内存,那么这些东西在内存中都是怎么存放的呢?

问题一:一个程序在内存中是怎么存放的?

我们将一个程序或多个程序编译为一个可执行文件,那么这个可执行文件在内存中是怎么存放的,首先它肯定不是将一对程序杂糅在一起,而是把内存分为几个区间,不同的区间存放不同的东西。

问题二:这些区间是?

在冯诺依曼的体系结构中一个进程必须有代码段,堆栈段,数据段。

高地址

  • 数据段
  • 代码段

低地址

更细致一点可分为:

  • bss段
  • 数据段
  • 只读段
  • 代码段

各个段的数据类型

.text:        代码段
.rodata:    const变量;字符串

.data:       已初始化的全局变量,已初始化的静态变量。数组、结构体也是(它们也属于变量)。
.bss:         未初始化或初始化为0的全局变量; 未初始化或初始化为0静态变量。数组、结构体也是(属于变量)。
stack:       函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。
                除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,
                函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别方便用来保存/恢复调用现场。
                从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
heap:       由程序员分配或释放

说明:

.bss不占用编译生成的.bin空间,.bin里边只有.text,.data,.rodata。
.bss段会被清零,uboot在初始化时会清.bss段。
堆栈里的变量是动态的,程序没运行时他们不存在。
 

#include 
 
int a=123; //a在全局已初始化数据区 
 
char *p1; //p1在BSS区(未初始化全局变量) 
 
int main()
{
	int b; //b为局部变量,在栈区 
 
	char s[]="abc"; //s为局部数组变量,在栈区 
			//"abc"为字符串常量,存储在常量区(.rodata) 
 
	char *p1,*p2; //p1,p2为局部变量,在栈区 
 
	char *p3="123456"; //p3在栈区,"123456"在常量区(.rodata)
 
	static int c=456; //c为局部(静态)数据,在已初始化数据区 
 
	//静态局部变量会自动初始化(因为BSS区自动用0或NULL初始化)
 
	p1=(char*)malloc(10); //分配得来的10个字节的区域在堆区 
 
	p2=(char*)malloc(20); //分配得来的20个字节的区域在堆区 
 
	free(p1);
 
	free(p2);
 
	p1=NULL; //显示地将p1置为NULL,避免以后错误地使用p1
 
	p2=NULL;
}

 

你可能感兴趣的:(C语言)