为什么gcc在声明int之后没有一致地打印0

时间:2016-08-10 12:43:46

标签: c gcc declaration

使用以下代码

#include <stdio.h>

int main() {

    int num;
    printf("%d\n", num);

    int* num2;
    printf("%p\n", &num2);

    return 0;
}

我的结果如下:

enter image description here

来自Memory allocation for global and local variables, 我知道全局变量num被隐式初始化为0, 即使它没有被我初始化。

现在我只是随意尝试,所以我将代码更改为

#include <stdio.h>

int main() {

    int num;
    printf("%d\n", num);

    int* num2;
    printf("%p\n", num2);

    return 0;
}

现在我得到了

enter image description here

问题:我不知道为什么num的价值不再是0

在我看来,我正在使用变量num2及其值HAS 无需使用变量num

我不仅对此感兴趣,还想听听您的意见 关于这种行为。

2 个答案:

答案 0 :(得分:3)

int num;
printf("%d\n", num);

int* num2;
printf("%p\n", num2);

在上述两种情况下,您都在读取未初始化变量的值(在一种情况下,此变量是简单整数,在其他情况下是指针 - 但就像我在两种情况下都说的那样,它们的值未初始化)。

默认情况下不会初始化局部变量。

读取未初始化变量的值为undefined behavior

这很好

int* num2;
printf("%p\n", &num2);

因为&numnum指针的地址 - 它已定义了值。 虽然更正确的是使用:

   printf("%p\n", (void*) &num2);

在其他情况下,您使用%p

答案 1 :(得分:1)

没有local关键字的

static个变量的存储时间为automaticnum就是这样一个变量。

在为其分配任何值之前,使用automatic存储读取varibale的值可能会产生任何结果。所以你不能指望一些确定的输出。

是的,正如您的代码所做的那样,您正在使用变量num2进行操作,并且其值与变量num无关。但是num2num可以在您num2 = &num;之后重新关联,之后您分配给*num2的内容会影响num的值。