Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
realloc():C程序中的下一个大小错误无效_C - Fatal编程技术网

realloc():C程序中的下一个大小错误无效

realloc():C程序中的下一个大小错误无效,c,C,我正在编写一个程序,从输入文件中读取员工记录数组,并使用插入排序和快速排序分别对其进行排序。它还可以找出不同数组大小的两种排序所花费的时间。我应该找到快速排序比插入排序更快的估计截止大小。为此,我编写了函数estimateCutoff(),它依次调用testRun()…(testRun()查找对特定数组进行排序所花费的时间,而estimateCutoff()则比较这两次排序所花费的时间)。但是,每次程序运行时,我都会遇到一个特定的错误,即: realloc(): invalid next siz

我正在编写一个程序,从输入文件中读取员工记录数组,并使用插入排序和快速排序分别对其进行排序。它还可以找出不同数组大小的两种排序所花费的时间。我应该找到快速排序比插入排序更快的估计截止大小。为此,我编写了函数estimateCutoff(),它依次调用testRun()…(testRun()查找对特定数组进行排序所花费的时间,而estimateCutoff()则比较这两次排序所花费的时间)。但是,每次程序运行时,我都会遇到一个特定的错误,即:

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)
{
    // ...
}