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

使用qsort对结构体数组排序时无输出问题求助

结构体数组用qsort排序无输出的问题排查与修复

代码中的核心问题

  • 函数参数类型不匹配:你定义的sort函数接收const char* arr[]类型参数,但实际传入的是struct People数组,类型完全不兼容,会导致qsort错误解析内存,引发未定义行为。
  • 比较函数逻辑错误:myCompare里直接将void*转为const char**解引用,但传入的指针实际指向struct People实例,正确做法是先转为结构体指针,再访问name成员做字符串比较。
  • qsort元素大小错误:调用qsort时传入sizeof(const char*),但数组元素是struct People类型,应传入sizeof(struct People)。
  • 打印语句错误:printf中用arr[i](结构体变量)匹配%s格式符,这是错误的,需改为arr[i].name;另外你仅初始化3个结构体,但数组大小设为17,剩余14个的name是野指针,直接打印会触发非法内存访问。

修正后的代码

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

struct People {
    char* name;
    char age;
};

static int myCompare(const void* a, const void* b)
{
    // 将void指针转换为结构体指针,取name成员进行字符串比较
    const struct People* p1 = (const struct People*)a;
    const struct People* p2 = (const struct People*)b;
    return strcmp(p1->name, p2->name);
}

// 修改函数参数为结构体数组类型
void sort(struct People arr[], int n)
{
    // 传入正确的元素大小:struct People的内存占用
    qsort(arr, n, sizeof(struct People), myCompare);
}

int main()
{
    // 数组大小设为实际初始化的元素数量,避免野指针问题
    int i = 0, n = 3;
    struct People arr[n];

    arr[0].name = "Bell";
    arr[0].age = 20;

    arr[1].name = "Tan";
    arr[1].age = 31;

    arr[2].name = "Jones";
    arr[2].age = 19;

    sort(arr, n);

    printf("\nSorted array is\n");
    for (i = 0; i < n; i++)
        // 打印结构体的name成员,同时输出age验证对应关系
        printf("%d: %s (age: %d) \n", i, arr[i].name, arr[i].age);

    return 0;
}

关键修正说明

  • 调整sort函数参数类型,使其适配结构体数组。
  • 重构比较函数逻辑,正确解析结构体指针并比较目标字段。
  • 修正qsort调用时的元素大小参数。
  • 修复打印语句的格式匹配问题,同时缩小数组大小至实际初始化数量,避免野指针访问。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:15:33