c - 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 值。我错了吗?我们如何解释这些结果?
解决方案
默认情况下,所有自动(非静态局部)变量都将使用不确定的值(可能看起来像随机或垃圾)未初始化。变量是否为指针并不重要。
此外,仅读取未初始化指针的值不会自动 UB(在 C 中),但取消引用未初始化指针肯定是。
但是,正如在一条评论中提到的,您需要使用"%p"
来打印指针(从技术上讲,它们也需要强制转换void *
)。不匹配的printf
格式说明符和参数类型确实会导致 UB。
推荐阅读
- workflow - 有没有更快的方法来获取 workflowHistory
- angular - 如何等待 Typescript 中 for 循环的结果?
- docker - 在远程 Docker 上的 VS Code 中运行 Jupyter
- java - Karatsuba 算法将数字拆分为 3 个字符串
- javascript - 通过转换类型将 Json 对象转换为另一个 Json 对象
- tensorflow - 无法通过任何方式将 .h5 模型转换为 ONNX 进行推理
- protractor - 如何在使用 Protractor 渲染后获取由 AngularJS 生成的 HTML 元素?
- python - 为什么在python中使用.lower时字符串输入值“male”!=“male”返回true?
- python - 如何在 django restframework 中从 allauth 的 EmailAddress 模型为用户电子邮件创建 ChoiceField?
- liquid - 映射/加入数组