You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:27:01