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) (见这个 )或者至少删除你的malloc
并return 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
。