使用长整数的 C 段错误

标签 c segmentation-fault

我不明白为什么这段代码会编译然后出现段错误:

#include <stdio.h>
#include <stdlib.h>

unsigned long int gcd(unsigned long int, unsigned long int);
unsigned long int lcm(unsigned long int, unsigned long int);

int main(int argc, char *argv[]) {
    int i;
    unsigned long int n = 1L;
    for (i = 2; i < 21; i++) {
        n = lcm(n, i);
    }
    printf("%ld\n", n);
    return 0;
}

unsigned long int gcd(unsigned long int a, unsigned long int b) {
    if (a == b) return a;
    if (a > b) return gcd(a - b, b);
    return gcd(a, b - a);
}

unsigned long int lcm(unsigned long int a, unsigned long int b) {
    return abs(a * b) / gcd(a, b);
}

这些 unsigned long 是否必要?我还注意到,如果我将 21 更改为 18,它会给出正确的结果。该代码旨在找到从120的所有数字的LCM。

gdb 中运行它会得到:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400643 in gcd (a=7536618, b=18) at p5.c:19
19    if (a > b) return gcd(a - b, b);

最佳答案

你溢出了堆栈。真可惜,因为那应该很容易优化为尾递归,完全递归对此非常矫枉过正。在任何现代编译器(cl、gcc、icc)中使用适当的优化级别应该可以消除段错误。

幸运的是,迭代地编写这个非常简单:

unsigned long gcd(unsigned long a, unsigned long b) 
{ 
  while(a != b)
    if(a > b)
       a -= b;
    else 
       b -= a;

  return a;
}

关于使用长整数的 C 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29194994/

相关文章:

c - 为什么会出现段错误?

ios - 我从哪里开始在 main.m 第 15 行中寻找 SIGSEGV 的原因

c++ - 在 xcode 4 中, "other c flags"和 "other c++ flags"有什么区别?

c - 执行完成后如何释放函数内部分配的动态内存

c - 可变大小的二维数组声明错误吗?

c++ - 尝试将对象插入空指针数组时出现段错误

c++ - 在 read() 上阻塞时线程 'disappears' 我该如何调试它?

c - 指向 double 组或指针数组的指针?

c - Unix Socket - 客户端服务器程序(段错误)

python - 导入时pyqt5段错误