为什么会有以下情况:
#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中缺少空字节的空间似乎并不重要呢?
发布于 2016-01-12 00:18:46
当你这样做时:
char array[3] = {'1', '2', '3'};
printf("%s\n", array);您正在调用未定义的行为,因为字符数组没有终止。你可能得到"123",或者完全没有,或者类似的想法,或者它可能会根据任意的条件而变化。
在您的具体情况下,只是一个经过了解的猜测,在局部变量array之后,它可能是函数参数的内存,而这些内存恰好是argc和argv。根据main的实际参数,甚至传递给程序的运行时值,thos内存位置上的字节将有所不同。有时,它们必须在适当的位置有一个NUL字节,并影响程序的输出。
总之,我的建议是不要过分考虑UB的情况。他们最好被认为只是个未知数。
发布于 2016-01-12 00:13:57
您没有提供字符串结束(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";https://stackoverflow.com/questions/34733339
复制相似问题