2013-02-05 71 views
0

它通常知道堆栈中的东西默认情况下未初始化。我试图用堆栈中的struct来证明,但意外的是我的指针初始化为null,但是为什么?什么是初始化这个指针?谁在堆栈中的结构中初始化字符指针

#include <stdio.h> 
#include <string.h> 

struct strustri { 
    int var1; 
    char *var2; 
}; 

int main() 
{ 
    struct strustri test1 = { 
      .var1 = 12, 
      .var2 = "Teststring", 
    }; 
    struct strustri test2; 

    printf("test1.var1 is %d\n", test1.var1); 
    printf("test2.var1 is %d\n", test2.var1); 

    printf("test1.var2 points to %p\n", test1.var2); 
    printf("test2.var2 points to %p\n", test2.var2); 
    return 1; 
} 

这是我的机器(Ubuntu的12.10)的输出:

test1.var1 is 12 
test2.var1 is -1271814320 
test1.var2 points to 0x400634 
test2.var2 points to (nil) 

我跑我的例子多次。我得到VAR1每次另一个价值,但VAR2总是指向零(空指针)...

+4

要知道,即使是停止的时钟每天两次显示正确的时间。 –

+0

是的,但我跑了几次程序。所有其他地址洗牌,所以我认为它是不可能的,它总是零...... – falstaff

+0

未定义的行为可能只是偶尔让你感到惊讶。 – Sebivor

回答

7

没有被初始化。

这只是什么垃圾恰好是在栈上的假象。切换变量声明的顺序,或者添加更多的局部变量,并且会得到不同的结果。

+0

你说得对。只要我切换订单,指针在程序的每次运行中都指向垃圾。 – falstaff

0

如果你把你的测试结构在一个单独的功能,然后有一个创建字符数组的另一个功能,比如200个字节长,您填写的一些信件,并调用两个功能交替,你会发现,你在test2中的值将会不同[最有可能,但不是100%保证 - 因为我们正在处理“未定义的行为”,否则可能发生其他事情)。

当执行INT VAR1创造test2的空间
0

,它具有为自己创造空间,但如果你不分配一个值给它,然后它会显示这是已经存在的价值..

但在var2的情况下,它是一个指针。如果指针没有初始化,那么它不指向任何东西,使之成为零或NULL或“\ 0”

+0

是的,但由于默认情况下堆栈上的指针未初始化,它*应该*指向一个随机地址...这是我的预期... – falstaff