如果没有\ 0,c的printf函数如何知道如何停止?

时间:2016-11-20 10:25:14

标签: c

我只是想知道你是否可以为我清理一些东西。

让我们举一些示例代码来解释我的问题:

#include <stdio.h>

int main(void)
{
    char test[100];
    printf("%s",test);
    return 0;
}

如果我没有完全弄错的话,这应该在我声明它之前随机输出一些在此内存地址处的字符,如果在虚拟环境中它是空的,则不输出任何内容。所以,这是我的理解。在我输入内容之前保存的内存被理解为char并写入终端。例如ascii&#39; a&#39; = 97 = 01100001。这就是它输出&#39; a&#39;的原因。可能是别的什么。或无。然后就停止了。

但如果我把&#39; a&#39;在第一个位置,然后像这样打印:

test[0] = 'a'
printf("%s",test);

它将输出&#39; a&#39;除了某些角色或什么都没有然后停止。

这就是我理解数组的方式:数组是指向第一个地址的指针,括号是在将数字乘以sizeof(type)后对地址进行解引用。

因此,在这种情况下,在第一个例子的内存中找到的随机01100001(Ascii&#39; a&#39;)应该与故意放置的01100001(Ascii&#39; a&#39)中的printf无法区分。 ;)在第二个例子中。然而,当我运行printf时,我没有得到100个随机输出。我得到一个。我并不认为随机字段通常设置为&#39; \ 0&#39;。

这意味着,我的理解在某处肯定是错的。请帮助我理解我犯错误的地方。

1 个答案:

答案 0 :(得分:6)

它没有,它是未定义的行为。您的程序只是意外地打印了&#34; 预期的&#34;值。

#include <stdio.h>

int main(void)
{
    char test[100];
    printf("%s",test);
    return 0;
}

你不能指望上面的代码做任何可预测的事情,它可能会打印一些东西,它可能是段错误的,没有办法预测实际会发生什么,因为这样的程序的行为是严格未定义的。