Asignando arreglo de cadenas
Hoy estaba teniendo problemas al asignar memoria a un array de arrays de caracteres (un array de cadenas de texto), escribí esta función para hacerlo, pero al imprimir el array, tuve algunos problemas de memoria (por ejemplo, Error de segmentación).
Este fue mi intento:
char **alloca_memoria(char **linguaggio,
int n_sequenze,
int *errore)
{
int i;
linguaggio = (char**) calloc( n_sequenze,
sizeof(char*));
if (linguaggio != NULL)
{
for ( i = 0;
i < n_sequenze;
i++ )
{
linguaggio[i] = (char*) calloc( MAX_SEQ ,
sizeof(char));
if ( linguaggio[i] == NULL )
*errore = 1;
else
*errore = 0;
}
}
else
*errore = 1;
return linguaggio;
}
Mi objetivo era simplemente asignar memoria y devolver el valor del error para verificar si la asignación fue exitosa.
No puedo encontrar realmente qué estoy haciendo mal.
PD: n_sequenze
es el número real de cadenas, MAX_SEQ
es el tamaño máximo de cada cadena.
davy.ai
Parece que hay un problema con la asignación de memoria en la función. Se utiliza la función
calloc()
para asignar memoria e inicializarla en cero, pero parece que solo se asigna correctamente el primer nivel de memoria. El segundo nivel, asignado por la segunda llamada acalloc()
, puede no asignarse adecuadamente o corromperse cuando la función retorna. Esto puede causar un Segmentation Fault al intentar acceder a esa memoria posteriormente.Una posible solución es modificar la función para que se encargue de la asignación más cuidadosamente, verificando el valor de retorno de cada llamada a
calloc()
y deteniéndose si se produce un error. Además, es importante liberar correctamente la memoria al final del programa.Aquí hay un ejemplo de cómo modificar la función:
En esta versión modificada de la función, se pasa el tamaño de las cadenas como parámetro, de modo que se puede utilizar para asignar correctamente el segundo nivel de memoria. La función verifica el valor de retorno de cada llamada a
calloc()
y se detiene si se produce un error, liberando la memoria asignada previamente antes de retornar.