es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 a calloc(), 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:

    char **alloca_memoria(int n_sequenze, int max_seq, int *errore) 
    {
        char **linguaggio = (char **)calloc(n_sequenze, sizeof(char *));
        if (linguaggio == NULL) {
            *errore = 1;  // asignación fallida
            return NULL;
        }
        *errore = 0;  // asignación exitosa
    
        for (int i = 0; i < n_sequenze; i++) {
            linguaggio[i] = (char *)calloc(max_seq, sizeof(char));
            if (linguaggio[i] == NULL) {
                *errore = 1;  // asignación fallida
                for (int j = 0; j < i; j++) {
                    free(linguaggio[j]);  // liberar la memoria asignada previamente
                }
                free(linguaggio);
                return NULL;
            }
        }
    
        return linguaggio; 
    }
    

    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.

Comments are closed.