我是 C 语言的初学者,遇到了内存分配问题。我检查了相关的讨论。我可能应该使用Valgrind,但是直到我学会如何使用它时,我才在这里发布问题。
这是我制作的合并排序代码的链接。http://ideone.com/utEzoq
但是,主要问题似乎在以下部分:
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;
}
但是,不同类型的输入会出现错误。当我输入反向排序和排序数组时,它按输入顺序返回输出。随机数给出 malloc"断言失败"错误。
帮助将不胜感激。
你的问题
void main()
自
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;
在第一个while
循环中写入超出数组长度的C
元素,从而可能损坏malloc
和free
内部使用的信息。
整个实现有错误。例如,以递归方式调用排序函数,并在每次调用时分配辅助内存。您返回分配的缓冲区,但从不对其进行任何操作,更不用说free
它了。排序函数不会排序,因为排序的数据(据说)在 C
中,您忽略了。您可以有效地打印出A
.
编辑:没有必要学习瓦尔格林德。安装它,用-g
编译你的程序,然后用Valgrind运行你的程序。除了输出之外,您还会收到错误和警告消息,清楚地说明发生内存冲突的位置。立即安装 Valgrind 并养成使用它的习惯 - 它将在未来节省您的时间。