【发布时间】:2016-08-10 02:48:15
【问题描述】:
#include <stdio.h>
int main(void)
{
int *ptr;
printf("%p", ptr); // Error: uninitialized local variable 'ptr' used
// Output is "0"
}
我正在阅读C-FAQ 关于空指针的信息。它说未初始化的指针可能指向任何地方。这是否意味着它指向内存中的随机位置?另外,如果这个陈述是真的,如果我尝试printf("%p",ptr),为什么会出现错误?由于未初始化的指针ptr指向某个随机位置,看来它必须打印出这个随机位置!
【问题讨论】:
-
它指向一个不确定的位置——你不能轻易预测它会指向哪里,但在任何严格意义上的术语中,它都不太可能是随机的。使用
printf("%p", ptr);会出现什么错误?您可能会被告知%p需要void *而您传递的是char *(不是同一件事)。您可能看不到任何输出,因为打印结束时没有换行符。你可能正在遭受其他事情的困扰。您尚未显示 MCVE (minimal reproducible example) 或收到的错误消息,因此我们无法为您提供帮助。 -
为什么不直接指向 null(0x0)?
-
“它说未初始化的指针可能指向任何地方”是真的。 “由于未初始化的指针 ptr 指向某个随机位置”不一定是真的。它也可能有一个陷阱值,当被引用时会杀死代码。它可能具有非法值,无法将其解释为指针。它没有初始化。这是 UB 未定义的行为。
-
@hedron 它可以取决于指针的声明位置/方式。非自动变量(例如全局变量)确实初始化为零。但我猜你在问为什么它不能总是初始化为 0 - 答案是因为 C 是一种极简主义语言。进行隐式初始化需要花费一些东西(例如 cpu 时间)。那么,当正确编写的代码无论如何都会执行显式初始化时,为什么还要支付这笔费用呢?
-
@dave 根据 C 标准它是 UB(使用未初始化的变量)
标签: c pointers initialization