Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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 尝试使用合并排序读取文件时,终端出现seg故障_C_Linux - Fatal编程技术网

C 尝试使用合并排序读取文件时,终端出现seg故障

C 尝试使用合并排序读取文件时,终端出现seg故障,c,linux,C,Linux,我试图读取一个名为data的文本文件,然后使用mergesort对其进行排序。我通过终端输入mergeSort

我试图读取一个名为data的文本文件,然后使用mergesort对其进行排序。我通过终端输入mergeSort mergesort的代码如下所示:

#include "mySort.h"
#include <stdio.h>
#include <stdlib.h>
#define MAX 50

void mySort(int array[], unsigned int first, unsigned int last)
{
int mid;
int i;
int j;
int k;
mid = 0; 
i = 0; 
j = 0; 
k = 0; 
int Larr[MAX], Rarr[MAX];

if (first < last) 
{
    mid = (first - last - 1)/2;
    mySort(array, first, mid);
    mySort(array, mid+1, last);



    for(i = 0; i < (mid - (first+1)); i++)
        Larr[i] = array[i + first -1];
    for(j = 0; j < (last - mid); j++)
        Rarr[j] = array[mid + j];

    Larr[mid - first + 1] = 9999999;
    Rarr[last - mid + 1] = 9999999;

    i = 0;
    j = 0;

    for(k = first; k <= last; k++)
        {
        if (myCompare(Larr[i], Rarr[j]) < 0) 
            {
            myCopy(&Larr[i],&array[k]);
            i++;
            }
        else
            {
            myCopy(&Rarr[j],&array[k]);
            j++;
            }
        }
}

}           
#包括“mySort.h”
#包括
#包括
#定义最大值50
void mySort(整数数组[],先无符号整数,后无符号整数)
{
int mid;
int i;
int j;
int k;
mid=0;
i=0;
j=0;
k=0;
整数最大值,整数最大值;
如果(第一次<最后一次)
{
mid=(第一个-最后一个-1)/2;
mySort(数组、第一个、中间);
mySort(数组,中间+1,最后);
对于(i=0;i<(中间-(第一+1));i++)
Larr[i]=数组[i+first-1];
对于(j=0;j<(最后一个-中间);j++)
Rarr[j]=数组[mid+j];
Larr[mid-first+1]=9999999;
Rarr[last-mid+1]=9999999;
i=0;
j=0;
for(k=第一;k
  • 使用
    gcc-g
    编译以确保已启用调试
  • 设置ulimit.
    ulimit-c unlimited
    。这样可以确保在发生SEGFULT时生成一个内核
  • 运行你的程序
  • 运行
    gdb./mergeSort core.XXX
    。当gdb启动时,使用“bt”命令获取回溯并查看哪里出错。从源文件所在的同一目录运行gdb
  • 也可以查看这些关于调试的链接


    提示:几乎可以肯定,您的写入超出了一个数组的末尾。查找数组索引可能超出范围的情况。跟踪错误(例如分段错误)是学习编程过程中的一个重要部分,比如你正在学习的课程。试着运行一个较小版本的程序——比如说,只运行你忘记给我们看的部分然后,如果这样做有效,继续读取输入并运行一个排序循环。等等……我建议创建一个
    main()
    使用固定大小的数组(比如14个元素)编程,并对其进行排序。这应该将排序代码从输入代码中分离出来,因此如果您没有因此崩溃,则问题可能出在输入代码中。确保您有一个
    无效转储数组(char const*tag,int*arr,int n)
    函数,该函数转储给定标记的内容(以便您可以识别对该函数的不同调用)以及数组和元素数。在函数末尾使用
    fflush(stdout)
    。在代码中的适当位置调用它以查看发生了什么。由于您使用的是Linux,因此使用
    malloc()可能会使您受益匪浅
    创建阵列(和
    free()
    释放阵列),然后使用验证您没有滥用内存。确保在启用调试标志的情况下进行编译;然后,您将获得关于滥用内存问题的非常准确的报告。以及
    -Wall-Wextra
    …以确保编译器可以发现的错误被发现。#(数组=无法访问地址0x7fff7678af68处的内存)在mySort中的mergeSort.c:7#1 0x000000000040899(数组=0x7fff77326f50,第一个=0,最后一个=1431655765)在mergeSort.c:21中,这些是我得到的错误。我如何着手修复它?请查看
    last
    的该值。我很愿意认为这是一个伪值。可能是在您计算
    mid
    的值时。我更新了我的答案,以包含两个有关调试程序的有用链接。祝您好运!