NULL指针与零段错误的比较

时间:2014-11-11 15:36:59

标签: c pointers null segmentation-fault comparison

所以,我有这段C代码:

226     if (!pair)
227         return;
228     if (!pair->index)
229         free(pair->index);

我正在使用非空对#'指针,其中包含null(0)成员' index'。正如人们所预料的那样,它运作得非常好。另一方面,这个

226     if (!pair)
227         return;
228     if (pair->index!=NULL)
229         free(pair->index);

生成分段错误(在第228行,其中if为)。这看起来很奇怪,因为两者应该完全相同,对吗? (第二个对我来说比第一个更有意义,这就是为什么我首先使用它)

我很好,只使用有效的否定表达式,但我想了解为什么第二个段错误。有任何想法吗? :)

(我正在使用gcc构建(Debian 4.7.2-5)4.7.2)

谢谢!

1 个答案:

答案 0 :(得分:3)

首先要注意的是,标准c已经在free内置了空检查,所以你不应该再自己检查一下。

在您的第一个代码段中,if (!pair->index) free(pair->index);行是良性的,可能是由于输入错误:free只有在pair->index为空且free将被忽略时才会被调用正如我已经说过的那样。您的!声明中有错误的if。所以你的程序不太可能在那里崩溃。 (从技术上讲,可能如果pair->index未初始化,因为未初始化的变量的使用是c)中未定义的行为。

您提供的第二个代码段没有问题,除非pair->index没有指向事先致电malloccalloc等给您的记忆。如果您确定你拥有pair->index的内存,那么问题是由于程序中其他地方的堆损坏或未定义的行为构造造成的。

相关问题