【问题标题】:Segmentation fault in c array [duplicate]c数组中的分段错误[重复]
【发布时间】: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


【解决方案1】:

在显示的代码中

 int n = 100;
 int sum[n][n][n];

sum 是一个可变长度数组 (VLA)。 根据您的实现,可用于 VLA(堆栈)的大小可能非常有限(通常为 1M,数组需要 4M,3 个数组需要 12M)。

一个简单的解决方案(有点)仍然使用 VLA,但从更大的空间(堆)获取内存是用指针替换数组定义并分配足够的内存。

int n = 100;
int (*sum)[n][n]; // sum is a pointer to n*n arrays (kinda using VLAs)
sum = malloc(n * sizeof *sum); // allocate space for n items of n*n elements
if (sum == NULL) exit(EXIT_FAILURE); // exit if allocation failure
//...
//use sum as if it was defined as sum[n][n][n]
//...
free(sum);

【讨论】:

  • 将上述概念扩展到您的其他数组(firstNumsecondNum)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2016-03-30
  • 2012-05-26
  • 2017-04-11
  • 2015-05-09
  • 2016-12-13
相关资源
最近更新 更多