使用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
相关产品推荐
相关产品推荐

