gpt4 book ai didi

c - 如何解决合并排序C程序中的段错误?

转载 作者:行者123 更新时间:2023-11-30 16:10:23 26 4
gpt4 key购买 nike

运行时报告段错误,该程序没有其他错误。报错为:

timeout: the monitored command dumped core  
sh: line 1: 18689 Segmentation fault timeout 10s main

当我删除其中一个递归函数时,程序会运行,但显示的输出是一些内存地址。我在阅读 geeksforgeeks.org 中的合并排序程序后创建了这个程序。这是该程序的链接:https://www.geeksforgeeks.org/merge-sort/

#include<stdlib.h>
#include<stdio.h>
void mergesort(int arr[],int l,int m,int r)
{
int l1=m-l+1;
int l2=r-m;
int arr1[l1],arr2[l2],i=0,j=0,k=1;
for(i=0;i<l1;i++)
{
arr1[i]=arr[l+1];
}
for(j=0;j<l2;j++)
{
arr2[j]=arr[m+1+j];
}
i=0;
j=0;
while(i<l1&&j<l2)
{
if(arr1[i]<arr2[j])
{
arr[k]=arr1[i];
}
else
{
arr[k]=arr2[j];
}
k++;
}
while(i<l1)
{
arr[k]=arr1[i];
k++;
i++;
}
while(j<l2)
{
arr[k]=arr2[j];
k++;
j++;
}
}
void printarray(int arr[],int r)
{
printf("the array is");
for(int i=0;i<r;i++)
{
printf("%d",arr[i]);
}

}
void merge(int arr[],int l,int r)
{
if(l<r)
{
int m=l+(r-1)/2;
merge(arr,0,m);
merge(arr,m+1,r);
mergesort(arr,l,m,r);
}
}
void main()
{
int arr[]={20,10,5,60,3,40,36};
int r=sizeof(arr)/sizeof(arr[0]);
printarray(arr,r);
merge(arr,0,r-1);
printarray(arr,r);
}

最佳答案

出现此错误的原因是超出范围的数组索引导致缓冲区溢出、错误初始化的指针等。

当程序尝试在为其分配的内存之外读取或写入或写入只能读取的内存时,会生成信号。

例如,您正在使用不支持数组负索引的语言访问 [-1]。

您的代码在变量初始化(在本例中用于表示数组索引)和逻辑错误方面存在错误。

请仔细检查更正的代码和具体代表您犯错误的位置的注释:

#include<stdlib.h>
#include<stdio.h>
void mergesort(int arr[],int l,int m,int r)
{
int l1=m-l+1;
int l2=r-m;
int arr1[l1],arr2[l2],i=0,j=0;

int k=l; //Initialize k to l and not to 1

for(i=0;i<l1;i++)
{
arr1[i]=arr[l+i];
}
for(j=0;j<l2;j++)
{
arr2[j]=arr[m+1+j];
}
i=0;
j=0;
while(i<l1 && j<l2)
{
if(arr1[i] <= arr2[j])
{
arr[k]=arr1[i];
i++; //Logical error
}
else
{
arr[k]=arr2[j];
j++; //Logical error
}
k++;
}
while(i<l1)
{
arr[k]=arr1[i];
k++;
i++;
}
while(j<l2)
{
arr[k]=arr2[j];
k++;
j++;
}
}
void printarray(int arr[],int r)
{
printf("the array is");
for(int i=0;i<r;i++)
{
printf("%d ",arr[i]);
}

}
void merge(int arr[],int l,int r)
{
if(l<r)
{
int m=l+(r-l)/2; //(r-1)/2 changed to (r-l)/2
merge(arr,l,m);
merge(arr,m+1,r);
mergesort(arr,al,m,r);
}
}
void main()
{
int arr[]={20,10,5,60,3,40,36};
int r=sizeof(arr)/sizeof(arr[0]);
printarray(arr,r);
merge(arr,0,r-1);
printarray(arr,r);
}

关于c - 如何解决合并排序C程序中的段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com