C++ main()内部和外部的字符指针声明

C++ main()内部和外部的字符指针声明,c++,c,pointers,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", st

我写的程序是:

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

我们如何解释这一点呢?

在名称空间范围中定义的变量在默认情况下是值初始化的,这就是为什么
stru\u 1
指向NULL

str_2
未初始化,因此该行

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 Address of pointer : 0028FF1C
STR_1 pointer : 00000000
具有静态存储持续时间的变量(包括全局变量)初始化为零,除非您另有指定

STR_2 pointer : 7EFDE000
除非另有规定,否则不会初始化自动变量。它们包含创建之前内存中碰巧存在的任何垃圾


(严格地说,对未初始化变量的值执行任何操作,甚至打印它,都是未定义的行为。)

静态是全局变量的默认存储类。
因此str1属于全局变量,并自动初始化为空。
并且'%p'打印指针地址。
因此,00000000而不是0。

您可能会对此链接感兴趣:

您不清楚什么?指针必须是字符串存储位置的实际地址,对吗?但是这里我们使用了一个scanf,字符串将被写入指针地址所指向的位置。
void main()
我看对了吗?请使用
int main()。如果你只是创建了一个指针,那么它什么也不指向。为什么它是UB,因为他还没有取消引用stru 2呢?@MM。他正试图打印它的价值。(指针本身未初始化)。就像
intx;printf(“%d”,x)。但是告诉我,包含字符串的指针不是地址吗@约翰尼卡特:指针只能包含地址,因为地址就是指针。如果你有一个数组,它可以指向一个数组,并将指针设置为指向它,但它不能包含一个数组。你可以补充一点,在最后一种情况下,仅仅读取指针(从左值到右值的转换)是未定义的行为(尽管我不知道现代的实现除了给出垃圾值之外还能做什么)。