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

C语言用qsort对数字各位降序排列报无效内存访问错误如何解决

代码问题原因

    1. 边界值处理错误:当输入n=0时,log10(0)属于数学未定义行为,会返回非法浮点值,转换为int后得到0甚至负数,后续声明的可变长度数组arr大小非法,数组读写时直接触发内存越界。
    1. 浮点数精度误差:log10返回值为double类型,double的有效位数只有53位,大于2^53的uint64_t整数值无法被double精确表示,会导致计算得到的digits位数比实际少1位,数组开小后循环写入数字时越界,破坏栈内存,最终触发非法访问错误。
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:06:08