斐波那契数程序崩溃,退出代码为 139

  • 本文关键字:退出 代码 崩溃 程序 c
  • 更新时间 :
  • 英文 :


我正在我的斐波那契数程序中测试边缘情况。如果第一个变量的输入值为999999或更低,则运行良好。当值更大时,它会崩溃。我已经在某个地方使用long int,真的不知道我做错了什么。

#include <stdio.h>
#include <stdlib.h>
long ft(long num, int m) {
long arr[num];
int i;
int j = 0;
i = 3;
arr[0] = 0;
arr[1] = 1;
arr[2] = 1;
while (i <= num && j != 1) {
arr[i] = 0;
if ((arr[i - 1] + arr[i - 2]) < m) {
arr[i] = arr[i - 1] + arr[i - 2];
} else {
arr[i] = (arr[i - 1] + arr[i - 2]) % m;
}
if (arr[i] == 1 && arr[i - 1] == 1 && arr[i - 2] == 0)
j = 1;
i++;
}
if (i < num)
return arr[num % (i - 3)];
else
return arr[i - 1];
}
int main() {
long n = 0;
int m = 0;
scanf("%ld %d", &n, &m);
printf("%ld", ft(n, m));
return 0;
}

堆栈太多了。请分配 arr 和malloc(),并请检查分配失败。不要忘记免费arr.

long *arr = malloc(sizeof(long) * (size_t)(num + 1));
if (!arr) return -1; // Error
//...
long r;
if (i < num) r= arr[num%(i-3)];
else r= arr[i-1];
free(arr);
return r;

您的程序计算斐波那契数以模给定的数字。

对于高于999999的值,它崩溃的原因是您分配了一个具有自动存储(即在堆栈上)的可变长度long数组,该数组超过了此段中的可用空间(4 或 8 MB)。程序具有未定义的行为,并导致堆栈溢出

相反,您应该使用malloccalloc从堆中分配此数组,并在离开函数之前释放它。

另请注意以下其他问题:

  • arr的长度应为num + 1,因为您将结果存储在arr[num]中。
  • 结果对于num == 0m == 1不正确。
  • 该函数对m == 0具有未定义的行为。
  • mnum的负值应返回错误结果,例如-1
  • 循环检测的测试可以简化。

这是一个修改版本:

#include <stdio.h>
#include <stdlib.h>
long ft(long num, int m) {
long *arr;
int i;
long res;
if (m < 0 || num < 0 || (arr = calloc(sizeof(*arr), num + 1)) == NULL)
return -1;
if (m == 1)
return 0;
arr[0] = 0;
arr[1] = 1;
arr[2] = 1;
res = arr[num];
for (i = 3; i <= num; i++) {
res = arr[i - 1] + arr[i - 2];
if (res >= m)
res -= m;
arr[i] = res;
if (res == 0 && arr[i - 1] == 1) { // handle cycle
res = arr[num % i];
break;
}
}
free(arr);
return res;
}
int main(int argc, char *argv[]) {
long n, n2;
int m = 0;
char *p;
if (argc > 1) {  // command line arguments: start[..end] [mod]
n = n2 = strtol(argv[0], &p, 0);
if (*p == '.' && p[1] == '.')
n2 = strtol(p + 2, NULL, 0);
if (argc > 2)
m = strtol(argv[0], NULL, 0);
} else {
if (scanf("%ld %d", &n, &m) != 2)
return 1;
n2 = n;
}
while (n <= n2)
printf("%ldn", ft(n++, m));
return 0;
}

最新更新