C语言 如果未设置PATH,find_path应该停止工作,但我得到了一个分段错误

0s0u357o  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(91)
char *find_path(char **envp) {
    if (envp = NULL || *envp = NULL)
        return 0;
    while (ft_strncmp("PATH=", *envp, 5))
        envp++; 
    return (*envp + 5);
}

我尝试将envp设为零,还尝试使用strcmp比较envp(环境变量)中未找到的PATH字符串,但它导致分段错误。
我想测试如果我们取消设置PATH,我想正常返回函数,而不会导致分段错误。

dsekswqp

dsekswqp1#

请在发布前格式化您的代码;像这样奇怪的缩进很难读。
要在C中检查是否相等,必须使用==,而不是==会将envp设置为NULL并返回其新值。由于此值为0,if子句将计算为false,并且return 0不会执行。此外,你应该测试一下如果envp * 不是 * 0会发生什么,然后再假设这就是问题所在,不管envp是什么值进入函数,你的代码片段都会导致分段错误,因为无论如何它都会变成NULL

char *find_path(char **envp)
{
    if (envp == NULL)
        return 0;
    if (*envp == NULL)
        return 0;
    while(ft_strncmp("PATH=", *envp, 5))
        envp++; 
    return (*envp + 5);
}
55ooxyrt

55ooxyrt2#

除了第一个if语句中的拼写错误(两个=都应该是==)(这可能是将代码复制到问题中的错误)之外,应该清楚的是,如果

while(ft_strncmp("PATH=", *envp, 5)) envp++;

如果在环境中找不到PATH=,它将到达envp数组末尾的NULL终止符,然后取消引用(并爆破)该终止符。

xuo3flqw

xuo3flqw3#

存在多个问题:

  • 压痕错误:这使得你和下一个程序员都很难阅读代码。2你的学校可能会强制执行当地的编码风格规则,对缩进不好的代码打不及格分(0)。
  • 测试envp = NULL*envp = NULL不正确:=运算符envp设置为NULL,并且计算结果为false,然后||尝试将*envp设置为NULL,导致分段错误,因为*envp现在是空指针。应使用==而不是=
  • while循环没有正确的结束条件:如果envp到达environ数组的末尾,则*envp将为空指针,这可能导致ft_strncmp崩溃(取决于它是否测试空指针)。应在*envp为非空时进行迭代,如果比较返回0,则返回*envp + 5。这样就不需要进行第二次初始测试。

以下是修改后的版本:

char *find_path(char **envp) {
    if (envp) {
        while (*envp) {
            if (ft_strncmp("PATH=", *envp, 5) == 0)
                return *envp + 5;
            envp++;
        }
    }
    // no environment or PATH not found: return a null pointer
    return 0;
}

相关问题