【发布时间】:2016-08-25 19:52:31
【问题描述】:
我试图了解在 c 程序中分配内存的位置。
void func1(char e, int f, int g)
{
int b = 4;
char * s = "hello world";
char * temp = (char *) malloc(15);
}
据我了解,堆栈 b、s 和 temp 上分配了三个自动变量。其中b(4)的内容存放在栈中,指针s和temp存放在栈中,temp的数据存放在堆中,但是s的数据存放在哪里呢?因为当我们离开 func1 调用时 b、s 和 temp 将消失,但内容的内存已被永久分配。我的其他问题是堆栈指针总是向下移动 4,就像在推送函数参数时一样,即使是一个字节的 char 也是如此? 即使 e 只有一个字节,堆栈也会像这样吗?
30:// other stuff
26: g
22: f
18: e
http://www.firmcodes.com/wp-content/uploads/2014/08/memory.png 这不是c程序的布局吗?
【问题讨论】:
-
就在您的工具链放置的任何位置。这取决于架构、编译器、链接器,什么不是……对于 GCC,它可能会转到
.rodata部分,但它在物理上会在哪里……见上文。 -
请阅读为什么不应该转换
malloc()的返回值。而且我认为您对堆栈的看法是正确的,但请注意没有chars,只有指针,指针为 4 或 8。 字符串文字 是代码中"hello world"字符串的正确术语,应该在Data segment 中。它将是只读的。 -
试着把它编译成程序集看看会发生什么。例如在 linux / gcc / intel cpu 上,使用:
gcc -S -masm=intel program_name.c -
好消息@iharob,如果您不介意,我会将其包含在我的回答中。
-
C 语言中没有栈。这个词甚至没有在标准中出现一次。堆也一样。这些概念中没有一个是 C 强制要求的,也没有用于每个实现。实际上,大多数现代实现不会将所有自动变量存储在 /a 堆栈上。而
s是一个普通的自动变量。为什么你认为它的价值存储在其他地方而不是其他地方?
标签: c pointers memory-management dynamic-memory-allocation string-literals