c - 未初始化的指针与 NULL 和 0

标签 c pointers initialization

我有一个未初始化的 int 指针。打印时始终显示为 0。

但是当检查 NULL 时,它没有通过条件。

有趣的是,这个野指针在没有抛出段错误的情况下取值。

有什么解释吗?

代码如下:

int main (){

int *p1;
int *p2;
int var=90;
printf("p1 = %x\n", p1);
printf("p2 = %x\n", p2);

p1 = &var;

if(p2==NULL)
{return 0;}

*p2 = *p1;

printf("*p2 = %x\n", *p2);

}

输出看起来像这样..

# gcc -std=c99 -o main *.c
# main
p1 = 0
p2 = 0
*p2 = 90

最佳答案

几点:

  1. 使用 %p 打印 void * 指针。
  2. 空指针的内部值不一定是 0,尽管在​​现代机器中通常是这样。
  3. 取消引用未初始化的指针是未定义的行为,任何事情都可能发生。特别是,这并不意味着段错误总会发生。

总而言之,像这样探索UB并不能证明什么。

关于c - 未初始化的指针与 NULL 和 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27268378/

相关文章:

c - 在C中输入大字符串

C 如何识别右值和左值?

c - 如何memset指针到指针

C 指向数组的 union 指针

macos - 2 行 OpenGL 程序中的 EXEC_BAD_ACCESS

c# - C# 的 TripleDES IV?

c - 为什么 CDROM_TOC.Length 是 UCHAR[2] 而不是 WORD?

c - SHA256 函数更改输入变量

c++ - 使一维指针数组指向二维 vector 中的对象

c++ - 为什么模板的静态成员在稍后在同一翻译单元中定义的对象之后初始化?