【发布时间】:2017-07-17 16:00:01
【问题描述】:
我有一个关于计算机内存工作的问题。我试图自己得到答案,但我无法弄清楚它是如何工作的。所以,想象一下一个人声明一个指向未来字符串的指针的情况;但是,初始化会稍晚一点:
char *str;
之后,他或她想要声明另一个变量。
char her;
紧接着,两个变量都被初始化,它们的地址和值被打印到 STDOUT。整个程序是这样的:
int main(void)
{
char *str;
char her;
her = 'Y';
str = "HelloMuraMana";
printf("%p\n", (void *)&str);
printf("%p\n", (void *)&(str[1]));
printf("%p\n", (void *)&(str[2]));
printf("%p\n", (void *)&(str[3]));
printf("%p\n", (void *)&(str[4]));
printf("%p\n", (void *)&her);
return (0);
}
现在,我的问题是:计算机如何为这两个变量(尤其是字符串字符)分配内存。我还想添加一张我的 macOS 机器结果显示给我的图片:
编辑:
我对这里的内存工作方式特别感兴趣。另外,请注意 str[0] 有一个地址,而 str1、str[2]、str[3] 和 str[4] 有其他的,与第一个元素地址不连续。
【问题讨论】:
-
太宽泛了。请编译器/链接器为您生成映射文件并查看。
-
不要发布指向图片的链接 - 在问题的文本中包含结果。内存分配的细节因架构和编译器而异;你真的需要缩小你的问题范围以获得有用的答案。
-
了解linkers
-
“单独声明和初始化的变量”不存在。变量只能在声明时初始化。任何其他语句都不是初始化。