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

LeetCode回文数代码遇数组越界及变长对象初始化错误求助

回文数问题isPalindrome函数错误分析与解决

一、运行时错误原因(数组越界)

报错信息:

Line 18: Char 14: runtime error: index 2 out of bounds for type 'int [*]' [solution.c]

问题核心是数组下标访问超出合法范围:

  1. 位数统计逻辑错误:while(k>1)会导致位数少算1。比如x=121时,循环结束后j=2,但实际是3位数,数组a[j]长度为2,最大合法下标为1。
  2. 循环下标违规:后续for(i=j; i>0; i--)直接用j作为数组下标,比如j=2时访问a[2],超出了数组a[2]的下标范围(合法下标为0、1),触发越界错误。

二、编译错误原因(变量长度数组初始化)

报错信息:

solution.c: In function ‘isPalindrome’
Line 14: Char 9: error: variable-sized object may not be initialized [solution.c]
int a[j]={0}; b[j]={0}, k=0;

C语言中,变量长度数组(VLA)(即长度由变量决定的数组,如int a[j])不允许在声明时用={0}初始化。因为编译器在编译阶段无法确定数组长度,无法完成初始化操作。

三、代码其他问题

  1. 数字拆分逻辑错误:x=x-a[i]无法正确去掉数字的最后一位,应改为x = x / 10。
  2. 数组反转逻辑混乱:b[j]=a[j]本身就是越界访问,且反转循环的下标计算错误,会导致重复交换或越界。
  3. 变量重复定义:块内重新定义k=0,覆盖了外部的k=x,容易引发逻辑混淆。
  4. 边界情况未处理:x=0时,j=0,会创建长度为0的数组,导致非法操作。

四、修正后的代码

数组实现版本

bool isPalindrome(int x) {
    // 负数直接不是回文数
    if (x < 0) {
        return false;
    }
    // x=0是回文数
    if (x == 0) {
        return true;
    }
    
    int temp = x;
    int digit_count = 0;
    // 正确统计数字位数
    while (temp > 0) {
        temp /= 10;
        digit_count++;
    }
    
    // 声明变量长度数组,手动初始化
    int a[digit_count];
    int b[digit_count];
    temp = x;
    
    // 拆分数字到数组a
    for (int i = digit_count - 1; i >= 0; i--) {
        a[i] = temp % 10;
        temp /= 10;
    }
    
    // 复制数组a到b并反转
    for (int i = 0; i < digit_count; i++) {
        b[i] = a[digit_count - 1 - i];
    }
    
    // 比较两个数组
    for (int i = 0; i < digit_count; i++) {
        if (a[i] != b[i]) {
            return false;
        }
    }
    return true;
}

更高效的无数组版本(推荐)

不需要额外数组,直接反转数字后半部分与前半部分比较,减少内存占用:

bool isPalindrome(int x) {
    // 负数或末尾为0且x不为0的情况,直接返回false
    if (x < 0 || (x % 10 == 0 && x != 0)) {
        return false;
    }
    
    int reversed_half = 0;
    while (x > reversed_half) {
        reversed_half = reversed_half * 10 + x % 10;
        x /= 10;
    }
    
    // 偶数位数直接比较,奇数位数去掉中间位后比较
    return x == reversed_half || x == reversed_half / 10;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:35:22