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

使用qsort排序结构体数组后仅单个元素留存的技术问题

问题根源与修复方案

我一眼就发现了导致数据丢失的核心问题——指针算术使用错误,这直接造成了内存越界,破坏了你的结构体数组数据。

错误代码分析

在读取文件的循环中,你写了这样一行代码:

person = people + (sizeof(myStruct) * i);

这里的问题在于:people是myStruct*类型的指针,C语言中指针加法是按元素个数进行偏移的,而非字节数。也就是说,people + i就已经指向了数组的第i个元素(编译器会自动计算i * sizeof(myStruct)的字节偏移量)。

你额外乘以sizeof(myStruct),相当于让指针偏移了i * sizeof(myStruct) * sizeof(myStruct)个字节,这远远超出了你用malloc分配的内存范围,属于未定义行为——你错误地写入了不属于自己的内存区域,后续排序时自然会出现数据丢失、空值乱码的情况。

修复后的代码

把那行指针赋值代码改成以下两种写法之一即可:

// 写法1:指针加法
person = people + i;
// 写法2:数组下标(更易读)
person = &people[i];

其他代码验证

顺便检查了你的比较函数,都是正确的:

  • lastCmp使用strcmp比较字符串,完全符合qsort的回调要求;
  • heightCmp用(personA->height > personB->height) - (personB->height > personA->height)返回-1/0/1,避免了直接用浮点数相减转int时的精度截断问题,非常稳妥。

额外提示

读取文件时要确保firstName和lastName这两个临时变量的大小足够容纳输入的字符串(比如你结构体里定义的是20字符,临时变量至少也要20+1的大小,避免溢出),不过这不是当前问题的直接诱因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:53