main()内外的char指针声明

Joh*_*Cat 2 c c++ pointers

我写的程序是:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出如下:

STR_1 Address of pointer : 00404048
STR_2 Address of pointer : 0028FF1C
STR_1 pointer : 00000000
STR_2 pointer : 7EFDE000
Run Code Online (Sandbox Code Playgroud)

我们怎么解释这个?

Luc*_*ore 9

默认情况下,在命名空间作用域中定义的变量是值初始化的,这就是为什么str_1指向NULL.

str_2 没有初始化,所以行

printf("STR_2 pointer : %p\n", str_2);
Run Code Online (Sandbox Code Playgroud)

实际上是未定义的行为.打印垃圾值.


Mik*_*our 6

STR_1 Address of pointer : 00404048
Run Code Online (Sandbox Code Playgroud)

这是静态内存中的地址,其中放置了全局变量.

STR_2 Address of pointer : 0028FF1C
Run Code Online (Sandbox Code Playgroud)

这是堆栈上的地址,其中放置了自动变量.

STR_1 pointer : 00000000
Run Code Online (Sandbox Code Playgroud)

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

STR_2 pointer : 7EFDE000
Run Code Online (Sandbox Code Playgroud)

除非另行指定,否则不会初始化自动变量.它们包含在创建之前发生在内存中的任何垃圾.

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