argc / argv 影响数组中的空字节?

argc / argv affects null byte in arrays?

为什么会出现以下情况:

#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)

而不是 argcargv 产生:123(尽管空字节没有空间)。

为什么 arrayvoid 中的空字节空间不足似乎无关紧要?

您没有提供 end-of-string (EOS) 零字节,因此 printf 继续前进直到它 [恰好] 找到一个(即垃圾字符)。

以下任何一个都可以:

char array[4] = { '1', '2', '3', '[=10=]' };
char array[4] = { '1', '2', '3' };
char array[4] = "123";
char array[] = { '1', '2', '3', '[=10=]' };
char array[] = "123";
char *array = "123";

当你这样做时:

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

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

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

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