传递NULL指针时C分段错误,尽管条件告诉函数如果传递NULL参数不运
发布时间:2020-12-16 10:41:24 所属栏目:百科 来源:网络整理
导读:我有一个处理字符串数组的程序.其中一个方法从所述数组中的指定位置移除一个字符串.代码如下: void RemoveStringAt(char *array[],int pos){ if((array[pos]!=NULL)(array!=NULL)(pos!=NULL)) { free(array[pos]); array[pos]=NULL; }} 该项目的一个规范是
我有一个处理字符串数组的程序.其中一个方法从所述数组中的指定位置移除一个字符串.代码如下:
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参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |