C语言程序的存储区域

@(C语言)[C语言, 学习笔记, 手写笔记, 整理]

参考资料


C语言程序的存储区域


* 1代码段(Code或Text)Code segment
* 2只读数据段(RO data) Read-only data segment
* 3已初始化读写数据段(RW data)
* 4未初始化数据段(BSS) Block start by symbol
* 5.堆(heap)
* 6.栈(stack)
Head First C 中的C的存储器
Alt text


C语言目标文件的内存布局

  代码段、只读数据段、读写数据段、未初始化数据段属于静态区域,而堆和栈属于动态区域。
  

* 代码段只读数据段读写数据段将在链接之后产生。
* 未初始化数据段将在程序初始化的时候开辟。
* 而将在程序的运行中分配和释放。

C语音程序分为映像运行时两种状态
在编译-连接后形成的映像中,将只包含代码段(Text)、只读数据段(RO Data)和读写数据段(RW Data)。
在程序运行之前,将动态生成未初始化数据段(BSS),
在程序的运行时还将动态形成堆(Heap)区域和栈(Stack)区域。

一般来说,在静态的映像文件中,各个部分称之为节(Section),而在运行时的各个部分称之为段(Segment)。如果不详细区分,可以统称为段。

栈空间的三种数据存储

1.函数内部的动态变量
2.函数的参数
3.函数的返回值

C语言存储实例程序

const char ro[ ] = {"this is read only data"};
/*只读数据区*/
static char rw_1[ ] ={"this is global read write data"}; 
/*已初始化读写数据段*/
char BSS_1[ 100]; 
/*未初始化数据段*/
const char *ptrconst ="constant data";
/*字符串放在只读取数据段*/

int main()
{
  short b;    
  /*在栈上,占用2个字节*/
  char a[100];
  /*在栈上开辟100个字节,它的值是其首地址*/
  char s[ ]="abcdefg";
  /*s在栈上,占用4个字节,"abcdefg"本身放置在只读数据存储区,占8个字节*/
  char *p1;
  /*p1在栈上,占用4个字节*/
  char *p2="123456";
  /*p2在栈上,p2指向的内容不能改,“123456”在只读数据区*/
  static char rw_2[ ]={"this is local read write data"};
  /*局部已初始化读写数据段*/
  static char BSS_2[100]; 
  /*局部未初始化数据段*/
  static int c = 0; 
  /*全局(静态)初始化区*/
  p1=(char *)malloc(10 * sizeof(char ));
  /*分配内存区域在堆区*/
  strcpy(p1,"xxxx");
  /*“XXXX”放在只读数据区,占5个字节*/
  free(p1); 
  /*使用free释放p1所指向的内存*/
  return 0;
  }
  

发表评论

电子邮件地址不会被公开。 必填项已用*标注