C 在for循环中管理内存

C 在for循环中管理内存,c,malloc,C,Malloc,我试图将信息从文件保存到堆中的结构。 问题是:如果我在保存数据的for循环中打印出信息,它工作得很好,但是当我在for循环之外打印出数据时,我得到的只是垃圾 我想知道原因:也许我和malloc的工作做得不好 我可以在第一个for循环中工作,但我想知道我做错了什么 typedef struct{ int tipoDeCodificacion; void* carta; }pedido; typedef struct{ void* nombre; void* reg

我试图将信息从文件保存到堆中的结构。 问题是:如果我在保存数据的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
    }
}
该行:

pedido *Pedidos=(pedido *)malloc(sizeof(cantidadCartas));
这是无效的。您正在为sizeofint字节分配内存。你应该:

pedido *Pedidos=(pedido *)malloc(sizeof(*Pedidos) * cantidadCartas);
为pedido结构的contidadCartas计数分配内存。使用pedido*指针访问Pedidos内存时,您会执行未定义的行为


你的代码真的很难读,缩进严重,有奇怪的区域名称,没有错误检查,而且它会泄漏你调用的所有malloc的内存。如果Pedidos==NULL{handle_error;}和iffscanf%d,…!=1等。int*typo=mallocsizeofint的分配;直接泄漏内存-它没有被释放。我还强烈建议您用英语编写所有代码,包括所有结构、变量和函数名

TipodeConfication的类型为int,但您正在分配类型为int*的tipo。这应该会给出一个错误。所以他正在写数组的结尾,而第一次打印不幸地工作了?对不起,我正在学习C语言并试图从这个错误中吸取教训。未定义的行为是未定义的。这可能有用。所有代码都可以工作。可能不会。它可能会格式化你的硬盘。它可能会在你的房间里繁殖龙。你不知道。没人知道。因为您不能将任何需求放在行为未定义的代码上。所以你不知道。我相信malloc一直在为Regalos分配内存,所以它正好工作。是的,我理解。但这是由于离开数组末尾而导致的未定义行为?没有数组。这只是记忆。它正在访问超出边界的内存。因此,它将引用超出有效内存的对象。表达式Pedidos[0]只是*Pedidos+0,这只是*Pedidos.Bro我爱你,这只是一个愚蠢的错误哈哈哈,为糟糕的代码感到抱歉