0

我无法从函数返回字符串。它在 main 方法中打印出一个垃圾值。我在这个论坛上看到了一个类似的问题,但该页面上的结果对我没有帮助。我不想将另一个变量传递给函数。我希望能够按原样返回字符串值。我该怎么做呢?

char *LookupPath(char **argv, char **dir)
{
    /* String Name To Be Returned */
    char path_name[MAX_PATH_LEN] = {0};
    char *result = malloc(sizeof(path_name));
    int i;

    /* Check To See If File Name Is Already An Absolute Path Name */
    if(*argv[0] == '/') {

    }

    /* Look In Path Directories */
    for(i = 0; dir[i] != NULL; i++) {
        strncat(path_name, dir[i], sizeof(path_name));
        strncat(path_name, "/", sizeof(path_name));
        strncat(path_name, argv[0], sizeof(path_name));
        result = path_name;
        if(access(result, F_OK) == 0) {
            printf("result: %s\n", result);
            return result;
        }
        path_name[0] = '\0';
    }

    /* File Name Not Found In Any Path Variable */
    return NULL;
}

非常感谢您的帮助!

4

4 回答 4

4
result = path_name;

应该:

strcpy(result, path_name);

或者更好的是,去掉直接path_name使用result

请注意,您应该记住在result不使用时释放它,返回它时,在调用它的函数中释放它。由于您返回NULL失败,在这种情况下,直接释放它,否则它是内存泄漏。

而且您使用strncat错误,请阅读手册

于 2013-10-22T05:38:39.030 回答
2

您不能path_name从函数返回本地数组(如您的 )。该本地数组位于调用框架内,返回时会弹出。

正如其他人回答的那样,你应该这样做

strncpy(result, path_name, MAX_PATH_LEN);

记录调用者应该释放结果的约定。

顺便说一句,您的代码效率很低;MAX_PATH_LEN您正在为通常要小得多的字符串分配相当大的块(通常为 4096)。

如果使用 GNU 扩展,您可以简单地使用asprintf(3)(请参阅)或至少删除您的mallocandreturn strdup(path_name);并使用strdup(3)(这是标准的,不需要任何 GNU 扩展)。

并学习如何使用valgrind

于 2013-10-22T05:37:51.363 回答
2

您分配的值path_name超过了它实际可以容纳的值。

    strncat(path_name, dir[i], sizeof(path_name));
    strncat(path_name, "/", sizeof(path_name));
    strncat(path_name, argv[0], sizeof(path_name));

应该:

    sprintf(path_name, "%s%s%s", dir[i],"/",argv[0]);
于 2013-10-22T05:52:14.240 回答
1

因为这条线:

result = path_name;

将重新分配 result以指向局部变量path_name,当函数返回时,该变量超出范围。这也意味着您有内存泄漏。

不要使用临时path_name变量,而是直接写入result.

于 2013-10-22T05:38:50.093 回答