问题:C语言中变量在内存中的存储形式
注:上面图片来自《程序是怎么跑起来的》
程序被加载到内存之后,使用的内存空间可分为 用于变量的、用于函数的、堆、栈,其中堆栈是程序运行时候动态分配的,用于变量的、用于函数的空间是编译器指定的,然后在程序加载到内存时候进行分配的。
变量分类:
- 全局初始化变量
- 全局未初始化变量
- 局部变量
下面是一个例子
#include "stdlib.h"
int a1 = 1;
int a2 = 2;
int b1;
void func1() {
int c = 3;
printf("%d", c);
}
int main() {
printf("%d,%d", a1, a2);
b1 = 2;
func1();
}
使用MAC上交叉编译ARM程序方式进行编译,将编译的产物拖到ida进行分析。
首先看下有哪些Segment,其中data和bss是我们需要关注的。
双击data,可以看到定义的两个全局变量a1和a2。dcd 1表示分配4字节空间用于存储1
双击bss,可以看到定义的未初始化的全局变量b1,% 4表示b1占4 byte,指定对b1进行赋值时应该分配的空间大小。