управление памятью в цикле for - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь сохранить информацию из файла в структурах в куче. Проблема в том, что если я распечатываю информацию в цикле for, где я сохраняю данные, она работает хорошо, но когда я распечатываю данные вне цикла for, я получаю только мусор я хочу знать, почему :( вероятно, я делаю плохую работу с malloc

Я мог бы работать внутри первого цикла for, но я хочу знать, что я делаю неправильно

typedef struct{
    int tipoDeCodificacion;
    void* carta;
}pedido;

typedef struct{
    void* nombre;
    void* regalo;
}regalos;
void creacionRegalos(FILE *cartas){ 
    FILE *final=fopen("regalos.txt","w");
    int cantidadCartas, i;
    fscanf(cartas,"%d\n",&cantidadCartas);
    printf("%d\n",cantidadCartas);

    pedido *Pedidos=(pedido *)malloc(sizeof(cantidadCartas));
    regalos **Regalos=malloc(sizeof(regalos *)*cantidadCartas);
    for(i=0;i<cantidadCartas;i++){
        char *lineaCodificada=malloc(sizeof(char)*100);
        int *tipo=malloc(sizeof(int));
        fscanf(cartas,"%d\n",tipo);

        Pedidos[i].tipoDeCodificacion=*tipo;
        printf("%d\n",Pedidos[i].tipoDeCodificacion); //this print works well
        fgets(lineaCodificada,100,cartas);
        Pedidos[i].carta=lineaCodificada;
        puts(Pedidos[i].carta); //this print works well
    }
    for (i = 0; i < cantidadCartas; i++) {
        printf("%d\n",Pedidos[i].tipoDeCodificacion); //just prints garbage
        printf("%s\n",(char *)Pedidos[i].carta);//prints garbage
    }
}

1 Ответ

1 голос
/ 13 апреля 2019

Строка:

pedido *Pedidos=(pedido *)malloc(sizeof(cantidadCartas));

недействительна.Вы выделяете память для sizeof(int) байтов.Вы должны:

pedido *Pedidos=(pedido *)malloc(sizeof(*Pedidos) * cantidadCartas);

выделить память для contidadCartas количества pedido структур.Когда вы обращаетесь к Pedidos памяти с помощью указателя pedido*, вы ведете неопределенное поведение.

Ваш код действительно трудно читается, имеет плохой отступ, со странными именами локалей, без проверки ошибок и утечка памяти для всех malloc звоните.Хороший код будет проверять все места ошибок if (Pedidos == NULL) { handle_error(); } и if(fscanf("%d", ....) != 1) и т. Д. Выделение int *typo = malloc(sizeof(int)); утечек памяти прямо вверх - это нигде free d.Я также настоятельно рекомендую вам написать весь код, включая всю структуру, переменные и имена функций на английском языке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...