【发布时间】:2021-10-31 15:11:06
【问题描述】:
我正在尝试编写一个程序来读取包含多个结构的二进制文件并打印该数据的排序版本,但是每当我尝试运行 qsort 时,它都会出现分段错误。我知道是 qsort 导致了分段错误,因为删除它可以让程序顺利运行。
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
typedef struct Data_s {
double dest;
float dec;
char colour[9];
short dress;
int experience;
char voyage;
char care;
unsigned short distance;
int cars;
char letter;
unsigned char quick;
char maelstrom;
unsigned int station;
short rat;
long macey;
float limb;
} Data;
int compare(const void *pa, const void * pb);
int main(int argc, char** argv) {
FILE* fp = fopen(argv[1],"rb");
int fn = fileno(fp);
struct stat sb;
fstat(fn,&sb);
#define NUM (int)(sb.st_size/sizeof(Data))
int i;
Data *arr[NUM];
for(i = 0; i < NUM; i++) {
arr[i] = (Data *)malloc(sizeof(Data));
fread(&arr[i]->dest,sizeof(arr[i] -> dest),1,fp);
fread(&arr[i]->dec,sizeof(arr[i]->dec),1,fp);
fread(&arr[i]->colour,sizeof(arr[i]->colour),1,fp);
fread(&arr[i]->dress,sizeof(arr[i]->dress),1,fp);
fread(&arr[i]->experience,sizeof(arr[i]->experience),1,fp);
fread(&arr[i]->voyage,sizeof(arr[i]->voyage),1,fp);
fread(&arr[i]->care,sizeof(arr[i]->care),1,fp);
fread(&arr[i]->distance,sizeof(arr[i]->distance),1,fp);
fread(&arr[i]->cars,sizeof(arr[i]->cars),1,fp);
fread(&arr[i]->letter,sizeof(arr[i]->letter),1,fp);
fread(&arr[i]->quick,sizeof(arr[i]->quick),1,fp);
fread(&arr[i]->maelstrom,sizeof(arr[i]->maelstrom),1,fp);
fread(&arr[i]->station,sizeof(arr[i]->station),1,fp);
fread(&arr[i]->rat,sizeof(arr[i]->rat),1,fp);
fread(&arr[i]->macey,sizeof(arr[i]->macey),1,fp);
fread(&arr[i]->limb,sizeof(arr[i]->limb),1,fp);
}
qsort(arr,NUM,sizeof(Data),compare);
for(i = 0; i < NUM; i++) {
printf("%d, ", arr[i]->dest);
}
printf("\n");
for(i = 0; i < NUM; i++) {
free(arr[i]);
}
fclose(fp);
return 0;
}
int compare (const void * pa, const void * pb)
{
const Data *p1 = (Data *)pa;
const Data *p2 = (Data *)pb;
return ( p1->dest- p2->dest);
}
【问题讨论】:
-
尝试通过valgrind运行代码定位问题源。
-
你为什么将
arr声明为Data *arr[NUM];?
标签: c segmentation-fault qsort