Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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
C中使用malloc:malloc时出错。C:2451:sYSMALLOc";“断言失败”;_C_Pointers_Malloc - Fatal编程技术网

C中使用malloc:malloc时出错。C:2451:sYSMALLOc";“断言失败”;

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

我是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) //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循环和free
C
。由于条件逻辑错误,因此出现索引错误,请尝试
(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;