首页 > 解决方案 > C中未初始化指针的值

问题描述

假设我们在 C 中有以下声明:

double d[25], * p;
int * t;
char * c;

我们如何解释以下 printf() 结果?

printf("d : %x\t",d);
printf("p : %x\t",p);
printf("t : %x\t",t);
printf("c : %x\t",c);

打印 ligne :

d : 62fd30    p : 1    t : 0    c : 39    

我们可以清楚地看到 d 的内存地址,但 p、t 和 c 看起来都不像地址。我曾经认为未初始化的指针在声明后采用 Null 值。我错了吗?我们如何解释这些结果?

标签: cpointersinitialization

解决方案


默认情况下,所有自动(非静态局部)变量都将使用不确定的值(可能看起来像随机或垃圾)未初始化。变量是否为指针并不重要。

此外,仅读取未初始化指针的值不会自动 UB(在 C 中),但取消引用未初始化指针肯定是。

但是,正如在一条评论中提到的,您需要使用"%p"来打印指针(从技术上讲,它们也需要强制转换void *)。不匹配的printf格式说明符和参数类型确实会导致 UB。


推荐阅读