我正在尝试创建一个程序,它接受一个包含 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/