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

The*_*282 1 c

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

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

#include <stdio.h>

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

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

但是如果我把'a'放在第一个位置然后像这样打印:

test[0] = 'a'
printf("%s",test);
Run Code Online (Sandbox Code Playgroud)

它将输出'a',另外输出一些字符或什么都没有然后停止.

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

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

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

Iha*_*imi 6

它没有,这是未定义的行为.您的程序只是意外打印出非" 预期 "值.

#include <stdio.h>

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

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

  • @TheCommoner282"获取"未定义行为的难点之一是它不一定是随机的.有时它是 - 有时它是彻头彻尾的不确定性 - 但有时它会一次又一次地做同样的事情,导致你认为它必须意味着什么.但事实并非如此. (2认同)