此代码段在哪里出现?

我的问题(现在希望简化为一个最小的示例)是为什么下面的代码出现段错误。

如果您已经找到了所建议的问题,那么当然可以将其视为重复的问题。问题是,我在最初的搜索中找不到问题,因此可能有很多新手,不知道错误原因。我建议将其作为我可以找到的副本:

主前分段故障

但是问题描述很长,因此我认为最小化和短得多的代码可能更好地说明了问题。无论如何,它都是重复的。我建议主持人将此设置为重复项,并设置从第二个可能的重复项到第一个重复项的链接。

#include <stdio.h>


/* Parameters */
#define N 3072  
#define LDA N

/* Main program */
int main()  {
        printf( "-----------------------------------------------> Entry main.\n" );
        /* Local arrays */
    double a[LDA*N];
        printf( "-----------------------------------------------> End main.\n" );
return 0;        
}

在以下情况下不会发生段错误

#define N 3072

被替换为

#define N 5

行时也不会发生段错误

double a[LDA*N];

被省略。

我特别感到困惑的是,段错误发生时没有达到

printf( "-----------------------------------------------> Entry main.\n" );

我直接把它放在main的开头。

为了完整起见,我运行以下代码:

ludi@ludi-M17xR4:~/Desktop/tests$ g++ -o minicombo.x minicombo.cc && ./minicombo.x
高炉

段错误很可能是由于数组定义引起的double a[LDA*N];这将创建一个具有自动存储持续时间(“在堆栈上”)的72MB阵列。您有几种选择。

  1. 使用std::vector<double>创建时具有所需大小或resize()成员函数。
  2. 使用std::unique_ptr<double[]>动态分配new[]/delete[]当心,手动内存管理充满了危险。
  3. 制作数组static或全局数组

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章