【发布时间】:2016-01-12 08:19:15
【问题描述】:
为什么会这样:
#include <stdio.h>
int main(int argc, char *argv[])
{
char array[3] = {'1', '2', '3'};
printf("%s\n", array);
return 0;
}
按预期产生1238À§Wˇ(“123”+一些随机字符),而相同的代码具有:
int main(void)
而不是argc,argv 生成:123(尽管空字节没有空间)。
array 和 void 中的空字节空间不足似乎无关紧要?
【问题讨论】:
-
一种未定义的行为可能与另一种不同:)。顺便说一句,
char array[3] = { '1', '2', '3', '4' };真的可以编译吗? -
您的意思是
char array[3] = {'1', '2', '3'};?您甚至没有为'4'分配足够的空间。那是违反约束的;编译器可以将其视为致命错误。 (不幸的是,gcc 默认只发出警告。) -
所以你尝试将四个字节放入一个 3 字节的数组中,不要费心用 NUL 终止它,然后想知道为什么它打印为字符串时会打印垃圾?这是未定义的行为。
-
使用
main(void)似乎可以解决问题,但实际上并非如此。使用另一个编译器、另一台机器、另一个目标架构,可能会导致“预期”问题。重要的是,您不会得出结论认为不使用main的参数可以解决问题,因为这是错误的。如果你想在 ideone.com 上尝试,你会发现在这两种情况下它实际上都没有输出任何东西,甚至123也没有(尽管我不得不承认我不明白为什么)