2

我写的程序是:

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

我们该如何解释呢?

4

3 回答 3

9

默认情况下,在命名空间范围内定义的变量是值初始化的,这就是str_1指向 NULL 的原因。

str_2没有初始化,所以该行

printf("STR_2 pointer : %p\n", str_2);

实际上是未定义的行为。打印一个垃圾值。

于 2013-11-05T14:17:30.537 回答
6
STR_1 Address of pointer : 00404048

那是静态内存中的一个地址,全局变量被放置在其中。

STR_2 Address of pointer : 0028FF1C

那是堆栈上的地址,放置自动变量的地方。

STR_1 pointer : 00000000

除非您另外指定,否则具有静态存储持续时间的变量(包括全局变量)初始化为零。

STR_2 pointer : 7EFDE000

除非您另外指定,否则不会初始化自动变量。它们包含在创建之前碰巧在内存中的任何垃圾。

(严格来说,使用未初始化变量的值做任何事情都是未定义的行为,甚至打印它。)

于 2013-11-05T14:21:55.313 回答
0

static 是全局变量的默认存储类。
因此 str1 属于它是一个全局变量,并自动初始化为 NULL。
'%p' 打印一个指针地址。
因此,00000000 而不是 0。
您会对此链接感兴趣:http ://www.tutorialspoint.com/ansi_c/c_storage_classes.htm

于 2013-11-05T14:38:30.017 回答