Función de retorno de cadena C devuelve basura

Estoy teniendo problemas para devolver una cadena de una función. Imprime un valor de basura en el método principal. Vi una pregunta similar en este foro, pero los resultados en esa página no me ayudaron. NO quiero pasar otra variable a la función. Quiero poder devolver el valor de cadena tal como está. ¿Cómo puedo hacer eso?

 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; } 

¡Tu ayuda es muy apreciada!

 result = path_name; 

debiera ser:

 strcpy(result, path_name); 

O mejor, deshacerse de path_name y usar el result directamente.

Tenga en cuenta que debe recordar liberar el result cuando no se usa, al devolverlo, libérelo en la función que lo llama. Como devuelve NULL en caso de error, en ese caso, libérelo directamente o es una pérdida de memoria.

Y si está usando strncat incorrectamente, lea el manual .

No puede devolver una matriz local (como su nombre de path_name ) desde una función. Esa matriz local está dentro del marco de la llamada , que aparece en el retorno.

Como otros respondieron, debes hacer

 strncpy(result, path_name, MAX_PATH_LEN); 

y documente la convención de que la persona que llama debe liberar el resultado.

Por cierto, su código es bastante ineficiente; está asignando una porción bastante grande de MAX_PATH_LEN (a menudo 4096) para una cadena que a menudo es mucho más pequeña.

Si usa extensiones GNU, simplemente puede usar asprintf (3) (vea esto ) o al menos quite su malloc y return strdup(path_name); y use strdup (3) (que es estándar, no requiere ninguna extensión de GNU).

Y aprende a usar valgrind .

Está asignando valores path_name más de lo que realmente puede contener.

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

debiera ser:

  sprintf(path_name, "%s%s%s", dir[i],"/",argv[0]); 

Por esta línea:

 result = path_name; 

Esto reasigna el result para apuntar a la variable local path_name , que queda fuera del scope cuando la función regresa. Esto también significa que tiene una pérdida de memoria.

En lugar de usar la variable path_name temporal, escriba directamente en el result .