使用以下代码
#include <stdio.h>
int main() {
int num;
printf("%d\n", num);
int* num2;
printf("%p\n", &num2);
return 0;
}
我的结果如下:
来自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;
}
现在我得到了
问题:我不知道为什么num
的价值不再是0
。
在我看来,我正在使用变量num2
及其值HAS
无需使用变量num
。
我不仅对此感兴趣,还想听听您的意见 关于这种行为。
答案 0 :(得分:3)
int num;
printf("%d\n", num);
int* num2;
printf("%p\n", num2);
在上述两种情况下,您都在读取未初始化变量的值(在一种情况下,此变量是简单整数,在其他情况下是指针 - 但就像我在两种情况下都说的那样,它们的值未初始化)。
默认情况下不会初始化局部变量。
读取未初始化变量的值为undefined behavior。
这很好
int* num2;
printf("%p\n", &num2);
因为&num
是num
指针的地址 - 它已定义了值。
虽然更正确的是使用:
printf("%p\n", (void*) &num2);
在其他情况下,您使用%p
。
答案 1 :(得分:1)
local
关键字的 static
个变量的存储时间为automatic
。num
就是这样一个变量。
在为其分配任何值之前,使用automatic
存储读取varibale的值可能会产生任何结果。所以你不能指望一些确定的输出。
是的,正如您的代码所做的那样,您正在使用变量num2
进行操作,并且其值与变量num
无关。但是num2
和num
可以在您num2 = #
之后重新关联,之后您分配给*num2
的内容会影响num
的值。