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

fre*_*r05 3 c string segmentation-fault

我有一个处理字符串数组的程序.其中一个方法从所述数组中的指定位置移除一个字符串.代码如下:

void RemoveStringAt(char *array[], int pos)
{
    if((array[pos]!=NULL)&&(array!=NULL)&&(pos!=NULL))
    {
        free(array[pos]);
        array[pos]=NULL;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

 RemoveStringAt(NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

并输出:

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

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

kay*_*lum 14

因为您在检查中取消引用NULL指针:

if((array[pos]!=NULL)...
Run Code Online (Sandbox Code Playgroud)

array是NULL,所以你不能这样做array[pos].在C中,if条件从左到右进行评估,因此只需将条件更改为如下所示.也就是说,更改排序,以便array[pos]永远不会评估array为NULL.

if((array!=NULL) && (pos < MAX_POS) && (array[pos]!=NULL))
Run Code Online (Sandbox Code Playgroud)

请注意,您的原始支票pos!=NULL不正确.出于几个原因.1. pos不是一个指针,所以比较它在NULL语义上是不正确的.2. NULL通常被定义为0并且0是有效值pos.因此,您需要定义一个MAX_POS指定条目数array或更好的条目数,将其作为显式参数传递给函数.

最后,毕竟,如果你不想,你实际上甚至不必array[pos]!=NULL在条件中进行检查.内部没有if块将导致SEGV即使array[pos]是NULL作为free被定义为接受一个NULL参数.