重新分配使我的程序在读取二进制文件功能时崩溃

时间:2019-01-01 12:46:03

标签: c realloc

因此我在C语言中具有此功能,可以将数据从二进制文件读取到动态数组。当我运行它时,它崩溃了,我试图放一些printf来知道它被卡在哪里,并且好像是在我尝试进行重新分配时。 我只是找不到任何错误。希望有人能帮助我。

tipoEmprestimo *lerFichBin_Emprestimos(tipoEmprestimo *vetorEmprestimos,int *quantEmprestimos)
{
    int quantlidos;
    FILE *ficheiro;


    ficheiro=fopen("emprestimos.dat","rb");

    if (ficheiro == NULL)
    {
        printf("\nNao foi possivel ler o ficheiro!");
        free(vetorEmprestimos);
        vetorEmprestimos=NULL;
        *quantEmprestimos=0;
    }
    else
    {

        quantlidos=fread(&quantEmprestimos,sizeof(int),1,ficheiro);
        if (quantlidos != 1)
        {
            printf("\nErro ao ler ficheiro!");
        }
        vetorEmprestimos=realloc(vetorEmprestimos,(*quantEmprestimos)*sizeof(tipoEmprestimo));


        if (vetorEmprestimos == NULL)
        {
            printf("\nErro ao reservar memoria!");

        }
        else
        {

            quantlidos=fread(vetorEmprestimos,sizeof(tipoEmprestimo),*quantEmprestimos,ficheiro);
            if(quantlidos != *quantEmprestimos)
            {
                printf("\nErro ao ler ficheiro!");
            }
        }

    }
    fclose(ficheiro);
return vetorEmprestimos;
}

2 个答案:

答案 0 :(得分:2)

可能的原因

    调用realloc时
  • vetorEmprestimos 未初始化
  • 当您调用realloc时,
  • vetorEmprestimos 指向堆栈
  • 当您调用realloc时,
  • vetorEmprestimos 指向一个恒定的内存区域

答案 1 :(得分:2)

  

我找不到任何错误

节省时间,让编译器为您提供帮助。

完全启用的优秀编译器会抱怨各种各样的事情:

In function 'lerFichBin_Emprestimos':
warning: conversion to 'int' from 'size_t {aka long unsigned int}' may alter its value [-Wconversion]
     quantlidos = fread(&quantEmprestimos, sizeof(int), 1, ficheiro);
                  ^~~~~
warning: conversion to 'long unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
         (*quantEmprestimos) * sizeof(tipoEmprestimo));
                             ^
warning: conversion to 'size_t {aka long unsigned int}' from 'int' may change the sign of the result [-Wsign-conversion]
           *quantEmprestimos, ficheiro);
           ^
warning: conversion to 'int' from 'size_t {aka long unsigned int}' may alter its value [-Wconversion]
       quantlidos = fread(vetorEmprestimos, sizeof(tipoEmprestimo),
                    ^~~~~
Finished building: ../round.c

解决上述问题可能/可能无法解决您的问题,但这表明在转向Stackoverflow之前首先采用了良好的编码惯例。


为什么要读取指针?

以下内容正在尝试读取指针而不是int。这是一个巨大的编码错误。

int *quantEmprestimos
...
... fread(&quantEmprestimos, ...

某些代码应该读取int

//        v--------No & 
... fread( quantEmprestimos, ...

避免使用显式类型

而不是代码类型,可能会弄错-与OP一样,使用被引用对象的大小。

//               points to an `int *`, mis-matched size
// quantlidos=fread(&quantEmprestimos, sizeof(int),1,ficheiro);

//                                   matched size                 
quantlidos = fread(quantEmprestimos, sizeof *quantEmprestimos, 1, ficheiro);

重新考虑错误处理

fread()是否不返回1,quantEmprestimos中使用的realloc()的值是什么?出错时,代码仍使用quantEmprestimosstdio通常是行缓冲的,因此缺少错误消息并不表示成功。使用 stderr 进行错误输出,因为每次写入时都会刷新它。

  

quantEmprestimos尚未初始化-可以是任何东西!

// OP's code with problems
quantlidos = fread(&quantEmprestimos, sizeof(int), 1, ficheiro);
if (quantlidos != 1) {
  printf("\nErro ao ler ficheiro!");
}
vetorEmprestimos = realloc(vetorEmprestimos, (*quantEmprestimos) * sizeof(tipoEmprestimo));

替代代码

quantlidos = fread(quantEmprestimos, sizeof *quantEmprestimos, 1, ficheiro);
if (quantlidos != 1) {
  // printf("\nErro ao ler ficheiro!");
  fprintf(stderr, "\nErro ao ler ficheiro!");
  exit(EXIT_FAILURE);  // or do something other than continue on.
}
vetorEmprestimos = realloc(vetorEmprestimos, sizeof *vetorEmprestimos * *quantEmprestimos);