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)
而不是 argc
,argv
产生:123
(尽管空字节没有空间)。
为什么 array
和 void
中的空字节空间不足似乎无关紧要?
您没有提供 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
之后它可能是函数参数的内存,而这些恰好是 argc
和 argv
.根据 main
的实际参数甚至传递给程序的运行时值,内存位置上的字节会有所不同。有时它们必须在适当的位置有一个 NUL 字节并影响程序的输出。
无论如何,我的建议是不要过度考虑 UB 的情况。最好将它们视为 undefined.
为什么会出现以下情况:
#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
中的空字节空间不足似乎无关紧要?
您没有提供 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
之后它可能是函数参数的内存,而这些恰好是 argc
和 argv
.根据 main
的实际参数甚至传递给程序的运行时值,内存位置上的字节会有所不同。有时它们必须在适当的位置有一个 NUL 字节并影响程序的输出。
无论如何,我的建议是不要过度考虑 UB 的情况。最好将它们视为 undefined.