谁在堆栈中的结构内初始化一个char指针

时间:2013-02-05 10:04:04

标签: c pointers nullpointerexception

众所周知,默认情况下,堆栈上的内容不会被初始化。我试图用堆栈上的结构来证明,但是我的指针初始化为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总是指向零(空指针)......

3 个答案:

答案 0 :(得分:7)

没有什么可以初始化它。

这只是你垃圾堆上垃圾的人工制品。切换变量声明的顺序,或者添加一些局部变量,你会得到不同的结果。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当执行int var1为test2创建空间时,它为自己创建了空间,但是如果你没有为它赋值,那么它将显示已存在的值..

但是在var2的情况下,它是一个指针。如果指针未初始化,则它不指向任何内容,使其为nil或NULL或'\ 0'