我写的程序是:
char* str_1;
void main()
{
char* str_2;
printf("STR_1 Address of pointer : %p\n", &str_1);
printf("STR_2 Address of pointer : %p\n", &str_2);
printf("STR_1 pointer : %p\n", str_1);
printf("STR_2 pointer : %p\n", str_2);
}
输出如下:
STR_1 Address of pointer : 00404048
STR_2 Address of pointer : 0028FF1C
STR_1 pointer : 00000000
STR_2 pointer : 7EFDE000
我们如何解释这个?
答案 0 :(得分:9)
默认情况下,在命名空间范围内定义的变量是值初始化的,这就是str_1
指向NULL的原因。
str_2
未初始化,因此行
printf("STR_2 pointer : %p\n", str_2);
实际上是未定义的行为。打印垃圾值。
答案 1 :(得分:6)
STR_1 Address of pointer : 00404048
这是静态存储器中的地址,其中放置了全局变量。
STR_2 Address of pointer : 0028FF1C
这是堆栈上的地址,其中放置了自动变量。
STR_1 pointer : 00000000
除非另有指定,否则具有静态存储持续时间的变量(包括全局变量)将被初始化为零。
STR_2 pointer : 7EFDE000
除非另行指定,否则不会初始化自动变量。它们包含在创建之前发生在内存中的任何垃圾。
(严格来说,使用未初始化变量的值做任何事情都是未定义的行为,甚至打印它。)
答案 2 :(得分:0)
static是全局变量的默认存储类。
因此str1属于全局变量,并自动初始化为NULL。
'%p'打印指针地址。因此,00000000而不是0
您可能会对此链接感兴趣:http://www.tutorialspoint.com/ansi_c/c_storage_classes.htm