【发布时间】:2021-09-26 13:45:41
【问题描述】:
我是 C 编程新手。我有一个程序,它测试计算一系列 3 个嵌套循环并在其中计算所需的时间,每当我尝试运行此代码时,它会导致分段错误。这是代码和调试信息:
#include <stdio.h>
#include <sys/time.h>
#define EXIT_SUCCESS 0;
int main(void){
struct timeval start,end;
gettimeofday(&start, NULL);
int n = 100;
int sum[n][n][n];
int firstNum[n][n][n];
int secondNum[n][n][n];
for(size_t a=0;a<n;a++){
for (size_t b = 0;b<n;b++){
for (size_t c=0;c<n;c++){
firstNum[a][b][c] = c;
secondNum[a][b][c] = 1;
sum[a][b][c] = firstNum[a][b][c] + secondNum[a][b][c];
}
}
}
gettimeofday(&end, NULL);
double timeTook = (end.tv_sec - start.tv_sec)*1000.0;
printf("Time took: %f\n", timeTook);
return EXIT_SUCCESS;
}
调试信息
Program received signal SIGSEGV, Segmentation fault.
main () at /home/ayush/Desktop/Project/trial.c:16
16 secondNum[a][b][c] = 1;
我想知道是什么导致了这个错误我正在访问内存范围内的数组索引,但它仍然导致分段错误。
【问题讨论】:
-
可变长度数组 (VLA)
int sum[n][n][n](与n = 100)对于您的实现来说太大了,无法处理。试试malloc()(和free())。 ...int (*sum)[n][n] = malloc(n * sizeof *sum); // replacing int sum[n][n][n]; -
感谢@pmg
int (*sum)[n][n] = malloc(n*sizeof *sum)解决了我的问题 -
取决于你用什么来编译。 MSVC 具有 /STACK 选项。默认堆栈大小为 1MB。但是对于您的问题,这不是解决方案。
-
@lulle 你说得对,我没有发现使用编译器标志对这个问题有什么用处,而是 malloc() 完成了工作
标签: c segmentation-fault