学过C语言的应该都知道程序分区这个概念,只是可能不是那么的熟悉,下面就简要的谈论一下C程序的分区。
比如在一个C程序中写一个i全局变量int a = 10;那么这个整形变量a存放在哪儿,又或者是函数中定义的,又该放在哪儿。
1、未初始化的全局变量和初始化为0的全局变量(.bss 段)
bss类型的全局变量只占运行时的内存空间,而不占用文件空间。存在于整个程序运行过程中。
2、初始化过且非零的全局变量(.data 段)
data类型的全局变量既占文件空间又占用运行时的内存空间。存在于整个程序运行过程中。
3、常量数据(.rodata 段)
常量不一定放在.rodata段,有的立即数与指令编码在一起放在.text 段中。
对于一个字符串常量,编译器会自动去掉重复的字符串,保证一个字符串在一个可执行文件中只存在一份复制。
.radata在多个进程间是共享的,提高运行空间利用率。
修改常量会出现段错误。
一些系统中会把rodata放在ROM中(或者NOR Flash),运行时直接读取,无需加载到RAM中。
4、代码(.text 段)
存放代码和部分整数常量,和.rodata段相似,主要不同的是这个段可以执行。
5、栈(stack)
可以用于实现函数的调用,管理临时变量。
栈向下增长。
6、堆(heap)
由程序员手动分配和释放的一块内存区域。
注意malloc、realloc、free的用法。这里不再详细讲解。