El puntero de función devuelve mantiene cambiando los valores anteriores en un arreglo.
Estoy intentando llenar una matriz 2D con cadenas. El problema es que logro llenar el primer índice, pero cuando procedo a la siguiente cadena, sigue cambiando los índices anteriores. Probablemente sea un problema con el puntero, este es el código relevante.
char* get_song_name(const char* song)
{
strip(song);
FILE* fp = fopen(song, "r");
char str[9999];
while (!feof(fp))
{
fgets(str, 9999, fp);
puts(str);
strip(str);
char* s = str;
return s;
}
}
FUNCIÓN DIFERENTE:
for (i = 0; i < lines; i++)
{
char* st = fgets(buff, 250, fp);
st = create_path("c:\\Users\\Marian\\Desktop\\beatles", st);
name[i] = get_song_name(st); // FUNCIONA SIN EMBARGO CAMBIA EL VALOR DE LOS ÍNDICES ANTERIORES TAMBIÉN
}
davy.ai
El problema con el código proporcionado es que en la función
get_song_name
, la variablechar* s = str
apunta al mismo lugar en memoria questr
, lo que significa que cada vez que se modificastr
, el valor des
también cambia. Por lo tanto, cuando se retornas
, siempre está apuntando al mismo lugar en memoria, que es el último valor leído del archivo.Para solucionar este problema,
char* s = str
debería reemplazarse porchar* s = malloc(strlen(str) + 1)
para asignar memoria para una nueva cadena, y luego copiar el contenido destr
as
usandostrcpy(s, str)
en lugar de retornars
.Alternativamente,
get_song_name
puede ser reescrito para aceptar un parámetro de búfer y copiar el contenido destr
al búfer antes de retornar. Esto asegura que se asigna un nuevo bloque de memoria para cada nombre de canción y que la función retorna el valor correcto sin cambiar los índices anteriores.Finalmente, es importante asegurarse de que el array
name
esté correctamente asignado con suficiente memoria para contener todos los nombres de canciones. Siname
no se asigna correctamente, podría sobrescribir memoria y causar un comportamiento indefinido.