【问题标题】:Dereferencing null pointer取消引用空指针
【发布时间】:2013-02-20 09:23:43
【问题描述】:

我正在尝试用 C++ 编写一个非常简单的指针赋值,如下所示:

float  *src;
if(someCondition == true)
    src = somePointer;
else
    src = someOtherPointer;

但是,当我尝试访问 src 时,我收到一条警告说“取消引用空指针(从变量 src 加载)”

另外,如果我尝试像这样为 src 赋予一些初始值:

float  *src = aPointer;

if(someCondition == true)
    src = somePointer;
else
    src = someOtherPointer;

我收到一条警告说分配给 src 的初始值从未被读取。尽管这似乎并没有影响我正在尝试做的事情,但我正在努力摆脱所有潜在的问题。这里似乎有什么问题?

感谢任何帮助。谢谢!

【问题讨论】:

  • someCondition的类型是什么?
  • somePointersomeOtherPointer 是什么?
  • 请告诉我们somePointersomeOtherPointer是如何建立的。
  • float * src = someCondition ? somePointer : someOtherPointer;
  • if(variableX > 350) src = &(anArray[0]) 否则 src = &(anArray[50])。这就是我要实现的条件的要点。谢谢!

标签: c++ dereference


【解决方案1】:

大概somePointersomeOtherPointer 之一或两者都是0/NULL

【讨论】:

  • 不,我知道它们是有效的指针。我也在其他地方使用它们。此外,即使由于我收到警告,这可能是不安全的,但这段代码工作得很好。如果两个指针中的任何一个为 NULL/0,它将不起作用。我只是想摆脱警告和可能的不安全情况。
  • 在我看来,编译器正在看到你看不到的东西。这可能是一些意外的执行路径,请尝试全部检查。通过注释掉代码块以查看警告是否/何时消失,从而缩小问题范围。
【解决方案2】:

由于您使用指针而不是引用,因此预计 NULL 可能是您的指针的值。

检查 NULL 可能符合您的利益:

if(!src) {/*handle null case*/}

【讨论】:

  • 'always' 有点强。程序可以建立和维护非空不变量,因此不必总是检查空值。
【解决方案3】:

似乎编译器不够聪明,无法意识到src 将始终被初始化。尽管 IDK 为什么会假设指针为 NULL,但它更有可能是一些垃圾值。这可以通过使用三元运算符 (?:) 将初始化设置为单个语句来解决:

float* src = someCondition ? somePointer : someOtherPointer;

编辑:

尝试将 src 初始化为 NULL。那应该摆脱初始化警告,我怀疑它会创建一个未使用的值警告。

【讨论】:

  • 我确实尝试过,但它仍然给出相同的警告。尽管有三级运算符,编译器并没有意识到指针已被初始化。 :(
  • 抱歉,这也没用。