内存布局和变量声明顺序

时间:2014-02-17 00:21:58

标签: c

考虑这个故意破坏的程序,从Zed Shaw's C tutorial修改,创建一个char数组并终止\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¦¦+"

1 个答案:

答案 0 :(得分:3)

  

是否在C?

中指定了此行为

没有

  

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

没有

  

如果没有,他依赖的原则是什么?

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