C语言用qsort对数字各位降序排列报无效内存访问错误如何解决
代码问题原因
- 边界值处理错误:当输入
n=0时,log10(0)属于数学未定义行为,会返回非法浮点值,转换为int后得到0甚至负数,后续声明的可变长度数组arr大小非法,数组读写时直接触发内存越界。
- 边界值处理错误:当输入
- 浮点数精度误差:
log10返回值为double类型,double的有效位数只有53位,大于2^53的uint64_t整数值无法被double精确表示,会导致计算得到的digits位数比实际少1位,数组开小后循环写入数字时越界,破坏栈内存,最终触发非法访问错误。
- 浮点数精度误差:
- 可选优化:当前排序逻辑为升序,你需要倒序拼接才能得到降序结果,直接修改比较函数为降序逻辑可以简化后续拼接代码。
修复方案
不要使用浮点数运算计算位数,改用整数循环统计即可,同时兼容n=0的边界情况:
#include <inttypes.h> #include <stdlib.h> int cmp (const void *a, const void *b) { // 直接按降序排序,后续不用倒序拼接 return *(int *)b - *(int *)a; } uint64_t descendingOrder(uint64_t n) { // 用do-while循环统计位数,兼容n=0的情况 int digits = 0; uint64_t temp = n; do { digits++; temp /= 10; } while(temp > 0); int arr[digits]; uint64_t out = 0; for(int i = 0; i < digits; i++) { arr[i] = n % 10; n /= 10; } qsort(arr, digits, sizeof(int), cmp); for (int i = 0; i < digits; i++) { out *= 10; out += arr[i]; } return out; }
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

