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
,我想正常返回函数,而不会导致分段错误。
3条答案
按热度按时间dsekswqp1#
请在发布前格式化您的代码;像这样奇怪的缩进很难读。
要在C中检查是否相等,必须使用
==
,而不是=
。=
会将envp
设置为NULL
并返回其新值。由于此值为0,if
子句将计算为false
,并且return 0
不会执行。此外,你应该测试一下如果envp
* 不是 * 0会发生什么,然后再假设这就是问题所在,不管envp
是什么值进入函数,你的代码片段都会导致分段错误,因为无论如何它都会变成NULL
。55ooxyrt2#
除了第一个
if
语句中的拼写错误(两个=
都应该是==
)(这可能是将代码复制到问题中的错误)之外,应该清楚的是,如果如果在环境中找不到
PATH=
,它将到达envp
数组末尾的NULL终止符,然后取消引用(并爆破)该终止符。xuo3flqw3#
存在多个问题:
envp = NULL
和*envp = NULL
不正确:=
运算符将envp
设置为NULL
,并且计算结果为false,然后||
尝试将*envp
设置为NULL
,导致分段错误,因为*envp
现在是空指针。应使用==
而不是=
while
循环没有正确的结束条件:如果envp
到达environ
数组的末尾,则*envp
将为空指针,这可能导致ft_strncmp
崩溃(取决于它是否测试空指针)。应在*envp
为非空时进行迭代,如果比较返回0
,则返回*envp + 5
。这样就不需要进行第二次初始测试。以下是修改后的版本: