C语言中变量在内存中存储形式

205 阅读1分钟

问题: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进行赋值时应该分配的空间大小。