0

为什么是以下内容:

#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无关紧要怎么办?

4

2 回答 2

3

您没有提供字符串结尾 (EOS) 零字节,因此printf请继续进行,直到它 [恰好] 找到一个(即垃圾字符)。

以下任何一项都可以:

char array[4] = { '1', '2', '3', '\0' };
char array[4] = { '1', '2', '3' };
char array[4] = "123";
char array[] = { '1', '2', '3', '\0' };
char array[] = "123";
char *array = "123";
于 2016-01-12T00:13:57.470 回答
2

当你这样做时:

char array[3] = {'1', '2', '3'};
printf("%s\n", array);

您正在调用未定义的行为,因为字符数组不是 NUL 终止的。你可能会得到“123”,或者什么都没有,或者类似的想法,或者它可能会根据任意条件而有所不同。

在您的特定情况下,只是一个有根据的猜测,在局部变量之后,array它可能是函数参数的内存,而那些恰好是argcand argv。根据main传递给程序的实际参数甚至是运行时值,这些内存位置上的字节会有所不同。有时它们必须在适当的位置有一个 NUL 字节并影响程序的输出。

无论如何,我的建议是不要过度考虑 UB 的情况。最好将它们视为undefined

于 2016-01-12T00:18:46.067 回答