Mac终端运行C代码迭代次数过高出现段错误无输出问题求助
问题成因
这一故障和Mac终端无关,完全是C代码本身的语法逻辑错误导致的,具体错误点如下:
- 变长数组声明时机错误:C语言中变长数组(VLA)的长度必须在声明时就有确定的有效值。你的代码里先声明了
int run;,还没通过scanf给run赋值,就直接定义了double numx[run];、double numy[run];、double points[run];三个变长数组,此时run是栈内存里的未初始化垃圾值,数组长度完全随机。3次迭代时刚好垃圾值足够大、没有触发栈越界,属于运气好的未定义行为,迭代次数超过垃圾值对应的数组长度后,就会出现栈越界触发段错误。 - 变量未初始化:计数变量
int n;未初始化就直接执行n += 1操作,即使代码能运行,最终统计的落入圆内的点数结果也是错误的。 - 冗余声明:
points数组全程未使用,属于无效声明,额外占用栈空间。
修复方法
调整代码顺序,把变长数组的声明放在scanf("%d", &run);之后,同时初始化所有变量,删除未使用的冗余数组即可,修复后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i = 0 ; int n = 0; // 初始化计数变量 int run; double d; double seed; double x; double y; double sum; printf("Enter the seed for the random number generator: "); scanf("%lf", &seed); srand(seed); printf("Enter the number of iterations to run: "); scanf("%d", &run ); // 拿到run的有效值之后再声明变长数组 double numx[run]; double numy[run]; for (i = 0; i < run; i++) { x = (double)rand()/RAND_MAX*2.0-1.0; printf(" x:%lf ", x*x); numx[i] = x*x; } printf("\n"); i = 0; for (i = 0; i < run; i++) { y = (double)rand()/RAND_MAX*2.0-1.0; printf(" y:%lf ", y*y); numy[i] = y*y; } for (i = 0; i < run; i++){ d = pow(numx[i]+ numy[i], 0.5); if (d <= 1.0){ n += 1; } } printf("\n"); printf("Number of points in circle: %d\n", n); return 0; }
如果需要适配不支持变长数组的编译器,也可以把数组改为malloc动态内存分配实现。
内容的提问来源于stack exchange,提问作者Dhruv Bishnoi
相关产品推荐
相关产品推荐

