2016-11-20 124 views
1

我只是想知道你能否为我清理一些东西。c的printf函数如何在没有 0的情况下知道如何停止?

让我们有一些示例代码来说明我的问题:

#include <stdio.h> 

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

如果我没有完全搞错了,这应该输出随机要么某些字符在这个内存地址之前,我宣布它还是什么,如果它是像在虚拟环境中一样空虚。所以,这是我的理解。在我把东西放入之前的记忆被理解为一个字符并写入终端。例如ascii'a'= 97 = 01100001.这就是为什么它输出'a'。可能是其他任何东西。或无。然后停止。

但如果我把在第一位置“A”,然后打印它像这样:

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

它将输出“a”和另外给一些字符或什么,然后停止。

这是我的理解阵列:一种阵列是一个指向第一个地址和括号内是所述地址的解引用添加次数的sizeof(类型)到它之后。

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

这意味着,我的理解一定是错误的地方。请帮助我了解我犯了我的错误。

+5

看起来像“未定义的行为”将是你的发现的好名字。 – usr2564301

+2

的可能的复制[什么时候的printf( “%S”,字符\ *)停止打印?](http://stackoverflow.com/questions/2726301/when-does-printfs-char-stop-printing) –

+0

“如何c的printf函数知道如何停止没有\ 0?“ - >'test [100]'没有被初始化。所以它可以有一个'\ 0'。我们不知道它是“没有\ 0”。 – chux

回答

6

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

#include <stdio.h> 

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

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

+0

所以,你说它可能会发生它打印出100个不同的未定义值? – TheCommoner282

+1

@ TheCommoner282是的,那将是一种行为。由于它没有定义,原则上它可以清除你的HD。但这当然是非常不可能的,也许是不可能的。 –

+0

好的,只是为了澄清。你在说未定义的行为。据我了解,它打印出一个由8位组成的内存部分,它读取为字符。所以,它只能把它们理解为字符,不可以吗?现在它一直持续到最后遇到“\ 0”为止,对吧? – TheCommoner282

相关问题