2011-02-02 47 views
1

我意识到这段代码有问题。 但是,我偶然发现了一些奇怪的行为,我想知道有人能解释一下。scanf的好奇行为

实施例1:

char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

输出是:(空)

实施例2:

int i; 
    char *foo; 
    scanf("%s",foo); 
    printf("%s",foo); 

输出是:VAL FOO的!

为什么会出现int i导致这个“工作”?

+2

它不起作用。它似乎做你期望的,但它是未定义的行为,因此是一个严重的错误。 – delnan 2011-02-02 22:19:31

回答

6

foofoo是一个指针,但是你没有将它设置为指向你已经分配的任何内存,所以相反它在启动时只有一个随机值,因此指向内存的某个随机部分。因此,任何事情都可能发生(即未定义的行为)。

int i的存在只是改变了堆栈上foo的位置,并因此改变了它具有的特定随机值。你不应该读这些不同的行为有意义的东西,因为它还没有定义。