C中使用malloc:malloc时出错。C:2451:sYSMALLOc";“断言失败”;
我是C语言的初学者,内存分配有问题。我查看了相关的讨论。我可能应该使用Valgrind,但在我学会如何使用它之前,我将在这里发布问题 这里有一个指向我创建的合并排序代码的链接。 然而,主要问题似乎出现在以下部分:C中使用malloc:malloc时出错。C:2451:sYSMALLOc";“断言失败”;,c,pointers,malloc,C,Pointers,Malloc,我是C语言的初学者,内存分配有问题。我查看了相关的讨论。我可能应该使用Valgrind,但在我学会如何使用它之前,我将在这里发布问题 这里有一个指向我创建的合并排序代码的链接。 然而,主要问题似乎出现在以下部分: void main() { MergeSort(list, 0, n-1) //calling function on pointer to array of integers } int *MergeSort(int *A, int x, int y) //declar
void main()
{
MergeSort(list, 0, n-1) //calling function on pointer to array of integers
}
int *MergeSort(int *A, int x, int y) //declaration
{
if(x==y)
{
return A;
}
else
{
int size=1+y-x;
int half=(x+y)/2;
MergeSort(A, x, half);
MergeSort(A, half+1, y);
int *C;
C=(int *)malloc(size*sizeof(int));
int j=x;
int k=half;
int i=0;
while((j<=half)||(k<=y))
{
if(A[j]<=A[k])
{
C[i]=A[j];
j++;
}
else
{
C[i]=A[k];
k++;
}
i++;
}
if(j==(half+1))
{
while(i<size)
{
C[i]=A[k];
i++;
k++;
}
}
else if(k==(y+1))
{
while(i<size)
{
C[i]=A[j];
i++;
j++;
}
}
return C;
}
void main()
{
MergeSort(list,0,n-1)//在指向整数数组的指针上调用函数
}
int*MergeSort(int*A,int x,int y)//声明
{
如果(x==y)
{
返回A;
}
其他的
{
int size=1+y-x;
半整数=(x+y)/2;
合并排序(A、x、一半);
合并排序(A,半+1,y);
int*C;
C=(int*)malloc(size*sizeof(int));
int j=x;
int k=一半;
int i=0;
while((j您在第一个while
循环中写入的C
元素超出了数组的长度,因此可能会损坏malloc
和free
内部使用的信息
整个实现都有错误。例如,您递归调用排序函数,并在每次调用中分配辅助内存。您返回分配的缓冲区,但从未对其执行任何操作,更不用说释放它了。排序函数不排序,因为排序后的数据(假定)是在C
中,您可以忽略它。您可以有效地打印出A
编辑:不需要学习Valgrind。安装它,用-g
编译你的程序,然后用Valgrind运行你的程序。除了你的输出,你会得到错误和警告消息,清楚地说明哪种内存冲突发生。现在就安装Valgrind,养成使用它的习惯-这将节省你未来的时间你的问题是什么
void main()
到
,
到
,
到
for(i=0;iI did list=MergeSort(list,0,n-1)调用将未排序的数组替换为排序数组时。是的,我还没有使用free。哦,好的,我会尝试。在我尝试了所有可能的方法后,将在此处更新。谢谢!临时数组C
只是为了使合并更容易。在函数结束时,使用将C
复制到A
中的适当范围a for循环和freeC
。由于条件逻辑错误,因此出现索引错误,请尝试(jmain int为什么需要设置为main int?我没有在main中返回任何内容。问题是,当我对两半调用MergeSort时,我没有将已排序的两半存储在任何位置。如果我创建两个单独的数组并将它们合并,那就不会被就地调用了,对吗?我如何实现就地排序?我做了A=MergeSort(A,x,half);A=MergeSort(A,half+1,y);我仍然得到一个错误。例如,12的输入给我11;43221给我442。
int main()
int k=half;
int k=half+1;
while((j<=half)||(k<=y))
while((j<=half)&&(k<=y))
return C;
for(i=0;i<size;++i){
A[x+i]=C[i];
}
free(C);
return A;