考虑这个故意破坏的程序,从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¦¦+"
答案 0 :(得分:3)
是否在C?
中指定了此行为
没有
编译器是否总是以相反的顺序布局内存?
没有
如果没有,他依赖的原则是什么?
他不依赖于一个原则;而是关于特定C编译器的行为。并非所有这些都会产生相同的结果。它是未定义的行为,因此可以打印任何(或什么都没有)。