使用qsort对含char成员的结构体数组排序时出现段错误如何解决
问题原因
段错误来源于compGamesByTitle比较函数的参数类型转换错误:qsort的比较函数接收的两个参数,是指向数组中两个待比较元素的指针。你的数组元素是game结构体类型,所以传入的a、b本质是const game *类型,不是char **。
之前的写法把a强转为char **后解引用,相当于把结构体首地址处存储的price字段值(double类型)当成了字符串指针去访问,访问了非法内存地址,直接触发段错误。
修复方案
修改比较函数的类型转换逻辑,直接取结构体的title字段做字符串比较即可:
int compGamesByTitle(const void *a,const void *b){ const game *aa = (const game *)a; const game *bb = (const game *)b; return strcmp(aa->title, bb->title); }
修复后完整可运行代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 7 typedef struct{ double price; char title[60]; } game; game gArr[MAX]; game buildGame(double num, const char *title); void printGame(game); int compGamesByTitle(const void * a,const void * b); int main(){ gArr[0] = buildGame(0.01, "Minecraft"); gArr[1] = buildGame(22.79 , "Opus Magnum"); gArr[2] = buildGame(7.79 , "TIS-100"); gArr[3] = buildGame(14.99 , "Trainz"); gArr[4] = buildGame(0 , "Code Combat"); gArr[5] = buildGame(7.79, "Lemmings Revolution"); gArr[6] = buildGame(64.96 , "Warcraft"); qsort(gArr,sizeof(gArr)/sizeof(gArr[0]), sizeof(gArr[0]), compGamesByTitle); printf("Sorted Games:\n"); for (int i = 0; i < MAX; i++){ printGame(gArr[i]); } return 0; } int compGamesByTitle(const void *a,const void *b){ const game *aa = (const game *)a; const game *bb = (const game *)b; return strcmp(aa->title, bb->title); } game buildGame(double num, const char *title){ game g; g.price = num; strcpy(g.title, title); return g; } void printGame(game g){ printf("Game g: %.2f, %s\n", g.price, g.title); }
排序后输出
Sorted Games: Game g: 0.00, Code Combat Game g: 7.79, Lemmings Revolution Game g: 0.01, Minecraft Game g: 22.79, Opus Magnum Game g: 7.79, TIS-100 Game g: 14.99, Trainz Game g: 64.96, Warcraft
内容的提问来源于stack exchange,提问作者user17067764
相关产品推荐
相关产品推荐

