进程地址空间中的Linux变量存储 - C

时间:2012-08-10 09:04:53

标签: c linux memory process

这是我正在研究的试卷中提出的一个问题。

“研究下面的代码。绘制描绘32位组织的图表 Linux进程地址空间。在图表标签中显示大致位置 of:a,b,c,* c(即c指向的内存),malloc和main“

int a; int b = 10;
int main()
{
  char *c;
  c = malloc(b);
  return (0);
}

这是我的看法,如果我错了,请纠正我。

a是未初始化的全局变量,因此将初始化为零并存储在BSS中。 b是一个初始化的全局变量,因此会进入数据段。 * c是一个自动变量,因此将存储在堆栈中。 c是动态分配的,因此会在堆上进行。 Main是执行代码,因此将存储在文本中。

我不确定malloc部分,它只是程序代码也会出现在文本中,还是作为函数调用在堆栈中?

1 个答案:

答案 0 :(得分:2)

你对这些变量大多是正确的。只是一个小小的修正。 c 指的是指针变量, * c 指的是 c 指向的内存。所以c是一个自动变量并进入堆栈, * c 是动态分配的内存,因此它驻留在堆中。

关于malloc,函数调用可能是在堆栈的帮助下进行的,即传递给malloc的参数可以使用堆栈传递,但函数即可执行部分,它位于 text 部分。会发生什么是main()将在堆栈上为malloc()创建参数,设置其值,然后设置 PC = malloc()的地址。 malloc的参数也可能是使用寄存器而不是堆栈传递的,因为只有一个参数,但可能因编译器和编译器以及平台而异。