gpt4 book ai didi

c - 内存布局和变量声明顺序

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:58 24 4
gpt4 key购买 nike

考虑这个故意破坏的程序,修改自 Zed Shaw's C tutorial ,它创建一个字符数组并离开终止 \0:

#include <stdio.h>

int main(int argc, char *argv[])
{
char name[] = "Zed";
char full_name[] = {
'Z', 'e', 'd',
' ', 'A', '.', ' ',
'S', 'h', 'a', 'w'
};

printf("name=\"%s\" and full_name=\"%s\"\n", name, full_name);

return 0;
}

输出是:

name="Zed" and full_name="Zed A. ShawZed"

并且 Zed 的评论表明此输出是预期的,即,内存似乎首先布置 full_name,然后连续布置 name。这种行为是在 C 中指定的吗?编译器是否总是以相反的顺序排列内存?如果不是,他依据的原理是什么?

如果我们切换声明变量的顺序:

char full_name[] = {
'Z', 'e', 'd',
' ', 'A', '.', ' ',
'S', 'h', 'a', 'w'
};
char name[] = "Zed";

然后我们在未终止的 char 数组的末尾得到预期的垃圾字符:

name="Zed" and full_name="Zed A. Shaw4¦h4¦¦+"

最佳答案

Is this behavior specified in C?

没有。

Does the compiler always layout the memory in reverse order?

没有。

If not, what is the principle he's depending on?

他不依赖原则;相反,关于特定 C 编译器的行为。并非所有这些都会产生相同的结果。这是未定义的行为,因此可以打印任何内容(或不打印任何内容)。

关于c - 内存布局和变量声明顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21818713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com