1

这是我正在学习的试卷中出现的一个问题。

“研究下面的代码。画一个图,描绘一个 32 位 Linux 进程地址空间的组织结构。在你的图中标注了大概的位置:a、b、c、*c(即 c 指向的内存)、malloc和主要”

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

以上是我的看法,如有错误请指正。

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

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

4

1 回答 1

2

您对变量的看法基本正确。不过只是一个小的修正。c指的是指针变量,*c指的是 c 指向的内存。因此 c 是一个自动变量并进入堆栈,而*c是动态分配的内存,因此它驻留在堆中。

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

于 2012-08-10T09:16:24.580 回答