简单C语言GCD程序在Mac OS X Sierra运行异常的修复方案咨询
修复Mac OS X下GCD函数返回值异常的问题
问题根源在于你的gcd函数存在未定义行为:当递归分支执行时,函数没有返回值。C语言要求非void类型的函数必须在所有代码路径都明确返回值,在线编译器可能对这种情况做了宽松处理,但Apple LLVM(clang)严格遵循C标准,导致未定义行为,最终变量g接收到的是无效值(表现为0)。
修复方案
在gcd函数的else分支中,添加return关键字返回递归调用的结果:
/* find the greatest common divisor of two integers */ #include <stdio.h> int gcd(int p, int q); // 建议将main的返回类型改为int,符合C标准 int main() { int u,v,g; printf("Enter two numbers: "); scanf("%d %d",&u,&v); g=gcd(u,v); printf("Greatest Common Divisor of %d and %d is %d\n",u,v,g); return 0; // 补充main函数的返回值 } int gcd(int a, int b) { int m; m=a%b; if(m==0) return(b); else // 修复:返回递归调用的结果 return gcd(b,m); }
额外说明
- 原代码中
void main()不符合C标准,标准要求main函数的返回类型为int,并在结尾返回0表示程序正常退出,虽然这不是导致当前问题的直接原因,但建议修正以保证代码的可移植性。 - 修复后的代码在clang和在线编译器中都会正常工作,因为它严格遵循了C语言的函数返回值规则。
内容的提问来源于stack exchange,提问作者user9374991
相关产品推荐
相关产品推荐

