【问题标题】:how to solve segmentation error in merge sort c program?如何解决归并排序c程序中的分段错误?
【发布时间】: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 循环中,您永远不会增加ij,因此循环条件不会改变。以及为什么要以k = 1 开头?

标签: c algorithm sorting mergesort


【解决方案1】:

由于超出范围的数组索引导致缓冲区溢出、未正确初始化的指针等,会发生此错误。

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

例如,您正在使用不支持数组负索引的语言访问 a[-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);
}

【讨论】:

  • @SandeepMMenon,永远!
猜你喜欢
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多