LeetCode回文数代码遇数组越界及变长对象初始化错误求助
回文数问题isPalindrome函数错误分析与解决
一、运行时错误原因(数组越界)
报错信息:
Line 18: Char 14: runtime error: index 2 out of bounds for type 'int [*]' [solution.c]
问题核心是数组下标访问超出合法范围:
- 位数统计逻辑错误:
while(k>1)会导致位数少算1。比如x=121时,循环结束后j=2,但实际是3位数,数组a[j]长度为2,最大合法下标为1。 - 循环下标违规:后续
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}初始化。因为编译器在编译阶段无法确定数组长度,无法完成初始化操作。
三、代码其他问题
- 数字拆分逻辑错误:
x=x-a[i]无法正确去掉数字的最后一位,应改为x = x / 10。 - 数组反转逻辑混乱:
b[j]=a[j]本身就是越界访问,且反转循环的下标计算错误,会导致重复交换或越界。 - 变量重复定义:块内重新定义
k=0,覆盖了外部的k=x,容易引发逻辑混淆。 - 边界情况未处理: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
相关产品推荐
相关产品推荐

