gpt4 book ai didi

c - execv 并测试正确的绝对路径

转载 作者:行者123 更新时间:2023-11-30 18:04:34 26 4
gpt4 key购买 nike

我正在尝试在 Linux 计算机上测试绝对路径以查找程序所在的位置,以便我可以使用特定参数运行它。问题是,当我找到它时,我不断向正确的路径添加更多字符串,并通过释放动态分配的内存来导致内存泄漏。堆栈转储的唯一修复是不释放(ret)。我相信基于 gdb,当我使用“ls”运行示例时,它会找到该程序并运行它,但会给出奇怪的结果。

  for(j = 0; j < i; j++, path = NULL)
{
token = strtok_r(path, delim, &saver);
if(token == NULL)
break;
else
{
strncat(ret, token, 80);
strncat(ret, "/", 1);
strncat(ret, command, 80);
args[0] = ret;
printf("%s\n", ret);
m = execv(ret, args);
printf("%d\n", m);
if(m < 0)
{
free(ret);
ret = malloc(120*sizeof(char));
}
else
break;
}
}

其中分隔符是冒号 (:),我相信 strncat 已正确完成。但我不确定,所以感谢您的帮助。

最佳答案

每次你malloc() ,您将获得新的未初始化内存。 strncat()然后会引发段错误,因为它将尝试在 ret 中查找 NUL 字符。 ,可能超出 ret 的 120 字节。 .

要么替换malloccalloc ,或使用memset(ret, 0, 120*sizeof(char));调用malloc后。或者以某种方式填写 ret第一个 strncat 之前有零.

如果您不释放它就不会中断的原因可能是由于 ret在堆栈上声明 - 然后不要释放/分配它。或者可能会出现 ret 的初始值全为零 - 但后续 malloc调用会产生未初始化的内存。

PS:您确定要使用 execv ?这将取代当前的流程。但我假设你 fork 了。

关于c - execv 并测试正确的绝对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7563164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com