C 内存布局和变量声明顺序

C 内存布局和变量声明顺序,c,C,考虑一下这个故意中断的程序,它是从修改而来的,它创建了一个字符数组并保留了终止的\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 f

考虑一下这个故意中断的程序,它是从修改而来的,它创建了一个字符数组并保留了终止的
\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;
}
Zed的评论表明这个输出是预期的,也就是说,内存似乎是先排列
全名
,然后连续排列
名称
。这种行为是在C中指定的吗?编译器是否总是按相反的顺序布局内存?如果不是,他依据的原则是什么

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

char full_name[] = {
    'Z', 'e', 'd',
    ' ', 'A', '.', ' ',
    'S', 'h', 'a', 'w'
};
char name[] = "Zed";
然后,我们在未终止字符数组的末尾获得预期的垃圾字符:

和全名 这种行为是在C中指定的吗

没有

编译器是否总是按相反的顺序布局内存

没有

如果不是,他依据的原则是什么


他不是在依赖一个原则;更确切地说,是关于特定C编译器的行为。并非所有这些方法都能产生相同的结果。这是一种未定义的行为,因此任何东西(或任何东西)都可以打印出来。

你处于未定义行为的领域。不管怎样,你为什么要写愚蠢的代码?Zed教学方法的一部分是让你故意破坏代码,这样你就能更好地理解代码的内部结构。如果你阅读了这个链接,它应该是有意义的。你所学到的只是编译器在那个优化级别上的特定实现。你对推广这个链接感兴趣吗?一点也不感兴趣。我碰巧在教程中复习了我非常古老的C语言技能,因为我听说过关于它的好东西。我之所以加入这个链接,是因为我怀疑像你这样的人会简单地提出问题,而不是回答问题,除非我有一位受人尊敬的消息来源证实这个问题在教学方面的好处。鉴于我在这个网站上的历史记录,暗示我是在为Zed发垃圾邮件是非常荒谬的,这个网站是公开的,你可以自由浏览。你没有准确地复制并粘贴代码。如果有一些参考资料,或者行为不同的例子,那会很有趣,因为这对于缓冲区溢出攻击似乎很重要(见我对这个问题的评论)。