我正在尝试将文件中的信息保存到堆中的结构中。 问题是:如果我在保存数据的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
}
}
答案 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。我也强烈建议您用英语编写所有代码,包括所有结构,变量和函数名称。