此分段错误的原因是什么:11 错误?

时间:2021-06-11 11:58:03

标签: c

我正在尝试用 C 编写一个程序,该程序可以读取最多 20 位的正整数。它应该输出大于输入的最小回文数。回文数是指数字颠倒时相同的数(例如,98789 是回文数,12344321 是回文数,12345 不是回文数,因为颠倒后变为 54321)。例如,示例运行将 17 作为输入和输出 22。但是,当我运行程序并放置输入时,会出现分段错误:11 错误。请注意,我不是一个有经验的程序员,所以代码可能看起来很丑:

#include <stdio.h>

unsigned long reversed(unsigned long palindrome);

int main() {
  unsigned long palindrome;
  scanf("%lu", &palindrome);

  while(1) {
    palindrome++;

    if (palindrome == reversed(palindrome)) {
      printf("%lu", reversed(palindrome));
      break;
    }
  }
}

unsigned long reversed(unsigned long palindrome) {
  int size = 0;
  unsigned long copy = palindrome;
  while(copy != 0) {
    copy /= 10;
    size++;
  }

  int count = 0;
  unsigned long arr[size];
  while (palindrome != 0) {
    arr[count] = palindrome % 10;
    count++;
  }

  unsigned long reverse = 0;
  for (int i = 0; i < size; i++) {
    reverse *= 10;
    reverse += arr[i];
  }
  return reverse;
}

该错误似乎表明我正在访问一个我不应该访问的内存位置,但我不明白其实际原因。它与无符号长整数或数组有关吗?我很感激任何建议。谢谢。

1 个答案:

答案 0 :(得分:4)

错误似乎是由这个循环引起的。

while (palindrome != 0) {
    arr[count] = palindrome % 10;
    count++;
  }

您没有在此循环中更改 palindrome 的值,但是 count 的值正在增加,导致您访问的内存在 count 变得更大时越界size

相关问题