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

时间:2016-01-11 23:57:52

标签: c arrays argv argc nul

为什么会出现以下情况:

#include <stdio.h>

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

     return 0;
}

按预期生成1238À§Wˇ(&#34; 123&#34; +一些随机字符),而相同的代码包含:

int main(void)

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

array void中{* 1}}空字节空间不足似乎无关紧要?

2 个答案:

答案 0 :(得分:3)

你没有提供字符串结尾(EOS)零字节,所以$context['pagination'] = Timber::get_pagination(); 一直持续到[刚刚发生]找到一个(即垃圾字符)。

以下任何一项都可行:

printf

答案 1 :(得分:2)

执行此操作时:

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

您正在调用未定义的行为,因为字符数组未终止NUL。你可能会得到&#34; 123&#34;,或者什么也没有,或者是这样的想法,或者它可能会根据任意条件而变化。

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

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