我是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&#34; Assertion Failed&#34;错误。
非常感谢帮助。
答案 0 :(得分:0)
您在第一个C
循环中写入超出数组长度的while
元素,从而可能损坏malloc
和free
内部使用的信息。
整个实施都有错误。例如,您递归调用排序函数并为每次调用分配辅助内存。你返回分配的缓冲区,但从不对它做任何事情,更不用说free
了。排序函数不排序,因为排序的数据(假设)在C
中,您忽略。您有效地打印出A
。
编辑:没有必要学习 Valgrind。安装它,使用-g
编译程序,然后使用Valgrind运行程序。除了输出之外,您还会收到错误和警告消息,清楚地说明发生何种内存违规的位置。现在安装Valgrind并养成使用它的习惯 - 它将为您节省时间。
答案 1 :(得分:0)
你的问题
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;