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