在for循环中管理内存

时间:2019-04-13 20:39:18

标签: c malloc

我正在尝试将文件中的信息保存到堆中的结构中。 问题是:如果我在保存数据的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 个答案:

答案 0 :(得分:1)

该行:

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。我也强烈建议您用英语编写所有代码,包括所有结构,变量和函数名称。