Realloc在读取二进制文件函数时使我的程序崩溃

Realloc在读取二进制文件函数时使我的程序崩溃,c,realloc,C,Realloc,所以我在C中有一个功能,将数据从二进制文件读取到动态数组。当我运行它时,它崩溃了,我试着放一些printf来知道它卡在哪里,好像是在我尝试做realloc的时候。 我就是找不到任何错误。希望有人能帮助我 tipoEmprestimo *lerFichBin_Emprestimos(tipoEmprestimo *vetorEmprestimos,int *quantEmprestimos) { int quantlidos; FILE *ficheiro; fiche

所以我在C中有一个功能,将数据从二进制文件读取到动态数组。当我运行它时,它崩溃了,我试着放一些printf来知道它卡在哪里,好像是在我尝试做realloc的时候。 我就是找不到任何错误。希望有人能帮助我

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;
}
在可能的原因中

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

      • 调用realloc时,vetorEmprestimos未初始化
      • 调用realloc时,vetorEmprestimos指向堆栈
      • 调用realloc时,vetorEmprestimos指向一个恒定的内存区域
      我就是找不到任何错误

      节省时间,让编译器帮助您

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

      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,那么
      realloc()
      中使用的
      quantEmprestimos
      的值是多少?出现错误时,代码仍然使用
      quantEmprestimos
      stdio
      通常是行缓冲的,因此缺少错误消息并不表示成功。使用stderr进行错误输出,因为每次写入时都会刷新错误输出

      quantEmprestimos
      未初始化-可能是任何东西

      替代代码

      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);
      
      我就是找不到任何错误

      节省时间,让编译器帮助您

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

      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,那么
      realloc()
      中使用的
      quantEmprestimos
      的值是多少?出现错误时,代码仍然使用
      quantEmprestimos
      stdio
      通常是行缓冲的,因此缺少错误消息并不表示成功。使用stderr进行错误输出,因为每次写入时都会刷新错误输出

      quantEmprestimos
      未初始化-可能是任何东西

      替代代码

      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);
      

      请提供引发不当行为的样本输入。理想情况下,找到一个文本输入,否则描述所需输入的(希望很少)非文本部分。如果所有内容都用英语命名,则此示例代码将更易于阅读。但是,我认为有两个主要原因导致
      realloc()
      可能失败:1.)要分配的内存量不可用2.)realloc的内存指针不是以前分配的结果,也不是
      NULL
      。这些是我将首先在调试器中检查的内容。请提供一个,以及引发错误行为的示例输入。理想情况下,找到一个文本输入,否则描述所需输入的(希望很少)非文本部分。如果所有内容都用英语命名,则此示例代码将更易于阅读。但是,我认为有两个主要原因导致
      realloc()
      可能失败:1.)要分配的内存量不可用2.)realloc的内存指针不是以前分配的结果,也不是
      NULL
      。这些是我首先要检查的东西。