realloc():C程序中的下一个大小错误无效
我正在编写一个程序,从输入文件中读取员工记录数组,并使用插入排序和快速排序分别对其进行排序。它还可以找出不同数组大小的两种排序所花费的时间。我应该找到快速排序比插入排序更快的估计截止大小。为此,我编写了函数estimateCutoff(),它依次调用testRun()…(testRun()查找对特定数组进行排序所花费的时间,而estimateCutoff()则比较这两次排序所花费的时间)。但是,每次程序运行时,我都会遇到一个特定的错误,即:realloc():C程序中的下一个大小错误无效,c,C,我正在编写一个程序,从输入文件中读取员工记录数组,并使用插入排序和快速排序分别对其进行排序。它还可以找出不同数组大小的两种排序所花费的时间。我应该找到快速排序比插入排序更快的估计截止大小。为此,我编写了函数estimateCutoff(),它依次调用testRun()…(testRun()查找对特定数组进行排序所花费的时间,而estimateCutoff()则比较这两次排序所花费的时间)。但是,每次程序运行时,我都会遇到一个特定的错误,即: realloc(): invalid next siz
realloc(): invalid next size
Aborted (core dumped)
调试代码后,我发现错误发生在testRun()中的数组emp2分配过程中,该数组已被EstimateCutton()调用
realloc():下一个大小无效程序收到信号SIGABRT,中止。 __GIU上升(信号)=sig@entry=6)位于../sysdeps/unix/sysv/linux/raise.c:51 51../sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录 谁能告诉我哪里出了问题
int estimateCutoff(empl * emp,int size){
int min=0,max=size,mid;
mid=(min+max)/2;
time t=testRun(emp,mid);
do
{
if(t.IStime<t.QStime)
min=mid;
else if(t.IStime>t.QStime)
max=mid;
else if(t.IStime==t.QStime)
return mid;
mid=(min+max)/2;
t=testRun(emp,mid);
} while(mid!=min && mid!= max);
return mid;
}
main()
函数如下所示:
#include<stack.h>
#include<quick.h>
int main(){
int arraycapacity=10;
empl * emp=malloc(sizeof(empl)*arraycapacity);
FILE * ptr=fopen("1000","r");
int size=0;
while(!feof(ptr))
{
fscanf(ptr,"%[^ ] %d\n",emp[size].name,&(emp[size].empID));
size++;
if(size==arraycapacity)
{
arraycapacity=arraycapacity*2;
emp=realloc(emp,sizeof(empl)*arraycapacity);
}
}
int mid=estimateCutoff(emp,size);
printf("mid = %d\n",mid);
fclose(ptr);
}
#包括
#包括
int main(){
int阵列容量=10;
emp*emp=malloc(sizeof(emp)*阵列容量);
文件*ptr=fopen(“1000”,“r”);
int size=0;
而(!feof(ptr))
{
fscanf(ptr,“%[^]%d\n”,emp[size].name,&(emp[size].empID));
大小++;
if(大小==阵列容量)
{
阵列容量=阵列容量*2;
emp=realloc(emp,雇员人数)*阵列容量);
}
}
int mid=估计截止值(emp,尺寸);
printf(“mid=%d\n”,mid);
fclose(ptr);
}
在main
中,每次测试都会将数组大小加倍,但从不检查realloc
是否成功
每次调用testRun
时,您都要调用malloc
两次,这是从estimateCutoff
中的一个循环内部发生的,但是您从来没有释放过任何内存,也从来没有检查malloc
是否成功
这一切都是造成灾难的原因。您应该采取以下步骤:
- 检查所有内存分配和重新分配是否成功
free()
在testrun
中每个测试结束时的内存分配
- 对阵列容量设置限制
- 将错误使用
feof()
的main
中的控制回路更改为
因为scanf
系列返回成功扫描的项目数。此消息表示您已超出分配内存的范围,并损坏了内存管理代码使用的控制信息。如果可能,获取并使用它来诊断问题。如果不行的话,找出你踩出边界的地方。注意。我会用Valgrind然后看看是否有效。谢谢你的信息顺便说一句@JonathanLeffler valgrind给出以下错误:valgrind内部错误:valgrind收到信号11(SIGSEGV)-退出--10016--si_代码=1;故障地址:0x790523C492;sp:0x1002ca9e30 valgrind:“不可能”发生了:被致命信号杀死我如你所说,但是,经过几次迭代后,程序仍然给出错误:继续。损坏的大小与上一个大小程序收到信号SIGABRT,中止__GIU上升(信号)=sig@entry=6)在../sysdeps/unix/sysv/linux/raise.c:51../sysdeps/unix/sysv/linux/raise.c:没有这样的文件或目录。因为排序函数中有一个错误。排序函数工作正常,testRun()独立工作。只有在使用EstimateCutton()时才会发生错误。假设否则(t.IStime==t.QStime)
永远不会为真?它们是浮点值。不管怎样,您已经测试了
,那么为什么还有和不必要的测试呢?
#include<stack.h>
#include<quick.h>
int main(){
int arraycapacity=10;
empl * emp=malloc(sizeof(empl)*arraycapacity);
FILE * ptr=fopen("1000","r");
int size=0;
while(!feof(ptr))
{
fscanf(ptr,"%[^ ] %d\n",emp[size].name,&(emp[size].empID));
size++;
if(size==arraycapacity)
{
arraycapacity=arraycapacity*2;
emp=realloc(emp,sizeof(empl)*arraycapacity);
}
}
int mid=estimateCutoff(emp,size);
printf("mid = %d\n",mid);
fclose(ptr);
}
while(fscanf(ptr, "%[^ ] %d\n", emp[size].name, &(emp[size].empID)) == 2)
{
// ...
}