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.

¿Por qué la estructura está causando un error de memoria?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct bank {
    char *name[3]; 
    char *ha[3];
    int bal[3];
};

typedef struct bank bank;

int main() {
    bank *SBI;

    SBI = (bank *)malloc(sizeof(bank));
    SBI->ha[0] = (char *)malloc(sizeof(char) * 5); // Allocate memory for the string

    strcpy(SBI->ha[0], "1234");

    printf("SUCCESS\n");

    free(SBI->ha[0]); // Free allocated memory for the string
    free(SBI); // Free allocated memory for the banking structure

    return 0;
}

¿Por qué el código anterior está generando un error de escritura de memoria? Cuando ejecuto el código, genera un error relacionado con la memoria. Soy principiante en programación en C. ¿Alguien puede ayudarme a entender qué hay de malo en el código que está causando el error?

Imagen del error</stdlib.h></string.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código está generando un error de escritura en la memoria porque los arreglos de caracteres en la estructura bank no tienen asignada ninguna memoria antes de ser utilizados. En el código, SBI se declara como un puntero a bank y se asigna memoria para él utilizando malloc, pero no se asigna memoria para los arreglos name, ha y bal dentro de la estructura bank.

    Para solucionar esto, se debe asignar memoria para estos arreglos antes de utilizarlos. Una forma de hacer esto es utilizar malloc para asignar memoria a cada elemento del arreglo individualmente, de esta manera:

    SBI->name[0] = malloc(sizeof(char) * MAX_NAME_LENGTH);
    SBI->ha[0] = malloc(sizeof(char) * MAX_HA_LENGTH);
    

    donde MAX_NAME_LENGTH y MAX_HA_LENGTH son constantes que definen la longitud máxima de las cadenas de nombre (name) y ha, respectivamente.

    Alternativamente, la estructura bank puede definirse con arreglos de longitud fija de la siguiente manera:

    struct bank
    {
        char name[3][MAX_NAME_LENGTH];
        char ha[3][MAX_HA_LENGTH];
        int bal[3];
    };
    

    De esta manera, la memoria se asigna automáticamente y los arreglos se pueden utilizar sin asignar memoria por separado.

Comments are closed.