C字符串返回函数返回垃圾

我无法从函数返回一个字符串。 它在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; } 

非常感谢您的帮助!

 result = path_name; 

应该:

 strcpy(result, path_name); 

或者更好,摆脱path_name并直接使用result

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

你正在使用strncat错误,请阅读手册 。

您无法从函数返回本地数组(如path_name )。 该本地数组位于调用框架内 ,在返回时弹出。

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

 strncpy(result, path_name, MAX_PATH_LEN); 

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

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

如果使用GNU扩展,你可以简单地使用asprintf(3) (见这个 )或者至少删除你的mallocreturn strdup(path_name); 并使用strdup(3) (这是标准的,不需要任何GNU扩展)。

并学习如何使用valgrind 。

您分配的值比它实际容纳的值更多。

  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]); 

因为这条线:

 result = path_name; 

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

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