首先我们给出内存布局
高内存地址
栈
向下增长,美国服务器,虚拟主机,可读可写可执行
空洞
向上增长
堆
向上增长,可读可写可执行
BSS段(未初始化数据段)
向上增长,可读可写不可执行
.data 数据段
向上增长,可读可写不可执行
.text 文本段(代码段)
向上增长,可读可写不可执行
低内存地址
不同类型的变量在内存中的位置:
1,局部变量、函数参数存放在栈上。静态局部变量,并不是在调用函数时分配,在函数返回时释放,而是像全局变量一样静态分配在.data数据段,但它的作用域只在函数中起作用。
2,堆,给动态分配内存使用。
3,全局变量、静态变量位于.data数据段;未初始化变量则位于.bss未初始化数据段。
4,const修饰的全局变量在.rodata只读数据段(const变量在定义时必须初始化,如果未初始化将被设为0或空),美国服务器,只读数据段在和.text同一个segment
5,代码段即存储程序文本。指令指针中的指令就从这里取得。这个段一般是可以被共享的:你可以使用两个编辑器(vi?)来编辑文本,则它们共享一个代码段。
全局变量初始化和未初始化的区别
我们都知道未初始化的静态变量或全局变量将被初始化为空串或0;未初始化的局部变量的值不确定。
全局变量不初始化,则默认为0,存放在.bss数据段中。如intx = 0和intx效果一样的。但是还是有差别的:
编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的,叫弱符号。
连接器在连接目标文件的时候,如果遇到两个重名符号,会有以下处理规则:
基于以上规则,使用以下程序测试
1 #include <stdio.h> global_int; 4 void setInt(); main() 7 { 8printf(“未初始化全局变量: %d\n”, global_int); 9 setInt();10printf(“改变全局变量: %d\n”, global_int);11 } global_int; setInt()16 {17global_int = 2;18 }人之所以有一张嘴,而有两只耳朵,原因是听的要比说的多一倍。