【问题标题】:Linux variable storage in the process address space - CLinux变量存储在进程地址空间-C
【发布时间】:2012-08-07 13:37:26
【问题描述】:

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

"研究下面的代码。画一个图来描述一个 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 部分,它只是程序代码也会以文本形式出现,还是作为函数调用在堆栈上?

【问题讨论】:

  • @H2CO3 a 是一个全局可修改变量,没有分配特定的编译时值 - 它转到 bss,即用 0 初始化

标签: c linux memory process


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2011-09-29
    • 1970-01-01
    相关资源
    最近更新 更多