这段代码在哪里?

时间:2015-07-06 14:32:47

标签: c++ segmentation-fault lapack

我的问题,现在简化为 - 希望 - 最小的例子,是以下代码段错误的原因。

当然,如果您找到后者,它当然可以被视为提议问题的副本。问题是,我在初始搜索中找不到问题,所以可能有很多新手,不知道错误的原因。我建议将此作为我可以找到的副本:

Segmentation Fault before main

但问题描述很长,所以我相信我的最小化和更短的代码可能更好地说明问题。在任何情况下,它都是重复的。 我建议版主将此设置为副本,并设置从第二个可能副本到第一个副本的链接。

#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

1 个答案:

答案 0 :(得分:5)

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

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