这是我正在学习的试卷上提出的一个问题。
“学习下面的代码。绘制一个图表,描绘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部分,它是只会以文本形式出现的程序代码,还是作为函数调用出现在堆栈上?

最佳答案

你对变量的看法基本上是对的。不过,只是一个小小的修正。C是指针变量,*C是C指向的内存,所以C是一个自动变量,在堆栈上,*C是动态分配的内存,所以它位于堆中。
关于malloc,函数调用可以在stack的帮助下进行,也就是说,传递给malloc的参数可以使用stack传递,但是函数,也就是可执行部分,它位于文本部分。结果是main()将在堆栈上为malloc()创建参数,设置其值,然后设置pc=address of malloc()。malloc的参数也有可能是使用寄存器而不是堆栈传递的,因为只有一个参数,但可能因编译器和平台而异。

10-07 19:32
查看更多