c - 快速排序算法给出段错误

标签 c algorithm sorting segmentation-fault quicksort

我正在尝试创建一个程序,它接受一个包含 5 个元素的 vector ,并根据它们的距离对它们进行排序(“距离”的含义不在此处)。

但每次执行它时都会出现“段错误”错误:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct 
{
char ID[8];
char Content[4];
int distance;

} DATA;


void sort(DATA *z, int l){

DATA p; //pivot
DATA t;
int aux=(l-1); //pivot's position
int i,j;

p.distance=z[l-1].distance;


if(l==1){return;}

for(i=0; i<l; i++){

    if((z[i].distance)<(p.distance)){

        continue;
    }


    if((z[i].distance)>(p.distance)){

        t=z[i];

            for(j=i; j<aux; j++){

                z[j]=z[j+1];

            }

            z[aux]=t;
            aux--;
    }

}


sort(z,aux-1);
sort(&z[aux+1],l-aux);

}

int main(){

DATA *z;
int l=5;
int i;

z=(DATA*)malloc(5*sizeof(DATA));

z[0].distance=5;
z[1].distance=1;
z[2].distance=4;
z[3].distance=3;
z[4].distance=2;

sort(z,l);

for(i=0; i<5; i++){

    printf("%d\n",z[i].distance);
}

free(z);

}

我不明白问题出在哪里。如果可以的话请帮忙。

最佳答案

您正在递归调用排序,而不检查第二个参数的值是什么。 使用 gdb 执行代码会产生以下输出:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400661 in sort (z=0x602010, l=-513) at main.c:21
21  p.distance=z[l-1].distance;
(gdb) bt
#0  0x0000000000400661 in sort (z=0x602010, l=-513) at main.c:21
#1  0x000000000040077c in sort (z=0x602010, l=-511) at main.c:51
#2  0x000000000040077c in sort (z=0x602010, l=-509) at main.c:51
#3  0x000000000040077c in sort (z=0x602010, l=-507) at main.c:51
#4  0x000000000040077c in sort (z=0x602010, l=-505) at main.c:51
#5  0x000000000040077c in sort (z=0x602010, l=-503) at main.c:51
#6  0x000000000040077c in sort (z=0x602010, l=-501) at main.c:51
#7  0x000000000040077c in sort (z=0x602010, l=-499) at main.c:51
#8  0x000000000040077c in sort (z=0x602010, l=-497) at main.c:51
#9  0x000000000040077c in sort (z=0x602010, l=-495) at main.c:51
#10 0x000000000040077c in sort (z=0x602010, l=-493) at main.c:51
#11 0x000000000040077c in sort (z=0x602010, l=-491) at main.c:51
#12 0x000000000040077c in sort (z=0x602010, l=-489) at main.c:51
#13 0x000000000040077c in sort (z=0x602010, l=-487) at main.c:51
#14 0x000000000040077c in sort (z=0x602010, l=-485) at main.c:51
#15 0x000000000040077c in sort (z=0x602010, l=-483) at main.c:51
#16 0x000000000040077c in sort (z=0x602010, l=-481) at main.c:51
#17 0x000000000040077c in sort (z=0x602010, l=-479) at main.c:51
#18 0x000000000040077c in sort (z=0x602010, l=-477) at main.c:51
#19 0x000000000040077c in sort (z=0x602010, l=-475) at main.c:51
#20 0x000000000040077c in sort (z=0x602010, l=-473) at main.c:51
#21 0x000000000040077c in sort (z=0x602010, l=-471) at main.c:51
#22 0x000000000040077c in sort (z=0x602010, l=-469) at main.c:51

您可以使用这样的调试符号来编译代码 gcc -g main.c 然后使用 gdb gdb a.out 执行它,加载后只需键入 run 来运行它,您将看到段错误。输入 bt 作为反向跟踪。

关于c - 快速排序算法给出段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44343406/

相关文章:

c - 段错误 : struct, 指针,二维数组

algorithm - 生成括号的问题

java - Java 中的 Shell 排序算法变体

c++ - 编译对象的布局

c - 在 scanf 上输入名称

javascript - jQuery DataTables - 按隐藏列排序日期

php - 如何按某个键的值对 JSON 对象进行排序

C 管理函数临时动态内存的有效方法

c++ - 求Pi第n位的函数