所以,我有这段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)
谢谢!
答案 0 :(得分:3)
首先要注意的是,标准c已经在free
内置了空检查,所以你不应该再自己检查一下。
在您的第一个代码段中,if (!pair->index) free(pair->index);
行是良性的,可能是由于输入错误:free
只有在pair->index
为空且free
将被忽略时才会被调用正如我已经说过的那样。您的!
声明中有错误的if
。所以你的程序不太可能在那里崩溃。 (从技术上讲,可能如果pair->index
未初始化,因为未初始化的变量的使用是c)中未定义的行为。
您提供的第二个代码段没有问题,除非pair->index
没有指向事先致电malloc
,calloc
等给您的记忆。如果您确定你拥有pair->index
的内存,那么问题是由于程序中其他地方的堆损坏或未定义的行为构造造成的。