C语言编程程序的内存如何布局
C语言编程程序的内存如何布局
分享到: 0重点关注以下内容:
C语言程序在内存中各个段的组成
C语言程序连接过程中的特性和常见错误
C语言程序的运行方式
一:C语言程序的存储区域
由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-连接三个阶段。编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,连接过程则将各个源文件生成的二进制机器代码文件组合成一个文件。
C语言编写的程序经过编译-连接后,将形成一个统一文件,它由几个部分组成。在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域:
1.代码段(Code或Text)
代码段由程序中执行的机器代码组成。在C语言中,程序语句进行编译后,形成机器代码。在执行程序的过程中,CPU的程序计数器指向代码段的每一条机器代码,并由处理器依次运行。
2.只读数据段(RO data)
只读数据段是程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。
3.已初始化读写数据段(RW data)
已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并具有初值,以供程序运行时读写。
4.未初始化数据段(BSS)
未初始化数据是在程序中声明,但是没有初始化的变量,这些变量在程序运行之前不需要占用存储器的空间。
5.堆(heap)
堆内存只在程序运行时出现,一般由程序员分配和释放。在具有操作系统的情况下,如果程序没有释放,操作系统可能在程序(例如一个进程)结束后回收内存。
6.栈(stack)
栈内存只在程序运行时出现,在函数内部使用的变量、函数的参数以及返回值将使用栈空间,栈空间由编译器自动分配和释放。
C语言目标文件的内存布局
看一个例子:
int a = 0; //全局初始化区,。data段
static int b=20; //全局初始化区,。data段
char *p1; //全局未初始化区 .bss段
const int A = 10; //.rodata段
void main(void)
{
int b; //栈
char s[] = "abc"; //栈
char *p2; //栈
static int c = 0; //全局(静态)初始化区 .data段
char *p3 = "123456"; //123
456\0在常量区,p3 在栈上。
p1 = (char*) malloc(10);//分配得来的10和20个字节的区域就在堆区
p2 = (char*) malloc(20);
strcpy(p1, "123456"); //12345
你可能喜欢
- C语言程序
- 语言分析
- 堆和栈的区别
- 嵌入式试题
- 内存分配
- 嵌入式C语言
- STM8的C语言编程
- C语言程序设计期末考试试题A[1]13页
- C语言程序设计教程(第二版)6页
- C语言程序设计A期末模拟试题一9页
- C语言程序设计3页
- 《C语言程序设计基础》上机实验报告(模版)2页
- C语言程序设计(第三版)-谭浩强[开始免费了]322页
- 堆和栈的区别16页
- 堆和栈的区别4页
- C语言堆栈入门——堆和栈的区别4页
- C#中堆和栈的区别分析11页
- java中堆和栈的区别4页
- c语言中堆和栈的区别2页
- 武汉理工大学2010期末(A卷)嵌入式试题及答案4页
- 嵌入式试题库6页
- 安徽工业大学嵌入式试题3页
- 嵌入式试题10页
- 嵌入式试题类型6页
- 吉大嵌入式试题B3页
- 模拟内存分配程序4页
- 内存分配报告15页
- 动态内存分配1页
- 项目6内存分配-PDA的内存管理24页
- 计算机操作系统 内存动态分配和回收模拟实现5页
- C语言程序内存分配布局3页


