传递NULL指针时C分段错误,尽管条件告诉函数如果传递NULL参数不运行?

传递NULL指针时C分段错误,尽管条件告诉函数如果传递NULL参数不运行?,第1张

概述我有一个处理字符串数组的程序.其中一个方法从所述数组中的指定位置移除一个字符串.代码如下: void RemoveStringAt(char *array[], int pos){ if((array[pos]!=NULL)&&(array!=NULL)&&(pos!=NULL)) { free(array[pos]); array[pos]=NU 我有一个处理字符串数组的程序.其中一个方法从所述数组中的指定位置移除一个字符串.代码如下:

voID RemoveStringAt(char *array[],int pos){    if((array[pos]!=NulL)&&(array!=NulL)&&(pos!=NulL))    {        free(array[pos]);        array[pos]=NulL;    }}

该项目的一个规范是传递NulL值时不应导致seg错误.这是我尝试时发生的事情:

RemoveStringAt(NulL,NulL);

并输出:

Segmentation fault (core dumped)

如果甚至执行方法的核心部分的条件之一是传递的值都不是NulL,为什么我会遇到分段错误?

解决方法 因为您在检查中取消引用NulL指针

if((array[pos]!=NulL)...

数组是NulL所以你不能做数组[pos].在C中,if条件从左到右进行评估,所以只需将条件更改为如下所示.也就是说,更改排序,以便在数组为NulL时永远不会计算数组[pos].

if((array!=NulL) && (pos < MAX_POS) && (array[pos]!=NulL))

请注意,原始检查pos!= NulL不正确.出于几个原因. 1. pos不是指针,因此将它与NulL进行比较在语义上是不正确的. 2. NulL通常定义为0,0是有效的pos值.因此,您需要定义一个MAX_POS,指定数组中的条目数或更好,然后将其作为显式参数传递给函数.

最后,在所有这些之后,你实际上甚至不必拥有数组[pos]!= NulL检查条件,如果你不想.即使array [pos]为NulL,if块中的任何内容都不会导致segv,因为free被定义为接受NulL参数.

总结

以上是内存溢出为你收集整理的传递NULL指针时C分段错误,尽管条件告诉函数如果传递NULL参数不运行?全部内容,希望文章能够帮你解决传递NULL指针时C分段错误,尽管条件告诉函数如果传递NULL参数不运行?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存