0

众所周知,栈上的东西默认是不初始化的。我试图用堆栈上的结构来证明这一点,但出乎意料的是,我的指针被初始化为 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

3 回答 3

7

什么都没有初始化它。

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

于 2013-02-05T10:05:25.230 回答
0

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

于 2013-02-05T10:09:46.327 回答
0

当执行 int var1 为 test2 创建空间时,它会为自己创建空间,但是如果您不为其分配值,那么它将显示已经存在的值..

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

于 2013-02-05T10:36:55.150 回答