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的存储器

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;
}