【发布时间】:2020-03-13 02:19:24
【问题描述】:
运行时报分段错误,该程序没有其他错误。报错是:
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);
}
【问题讨论】:
-
也许是时候学习如何使用调试器了
-
可能有一个栅栏错误导致您访问阵列外部。在调试器中单步执行程序,确保所有索引都在 0 到 6 之间。
-
arr1[i]=arr[l+1];您将arr1的所有元素设置为相同的值。那应该是arr[l+i]。 -
在 0x7ffcf368083c 线程 T0 地址处写入大小为 4 的地址 0x7ffcf368083c 位于帧中偏移量 60 处的线程 T0 堆栈中 此帧有 1 个对象:[32, 60) 'arr'
-
在第一个
while循环中,您永远不会增加i或j,因此循环条件不会改变。以及为什么要以k = 1开头?
标签: c algorithm sorting mergesort