这段代码在哪里?

Lud*_*udi 3 c++ segmentation-fault lapack

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

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

主要之前的分段故障

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

#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;        
}
Run Code Online (Sandbox Code Playgroud)

当发生段错误时不会发生

#define N 3072
Run Code Online (Sandbox Code Playgroud)

被替换为

#define N 5
Run Code Online (Sandbox Code Playgroud)

线路时也不会发生段错误

double a[LDA*N];
Run Code Online (Sandbox Code Playgroud)

省略.

我特别感到困惑的是,在没有达到的情况下发生了段错误

printf( "-----------------------------------------------> Entry main.\n" );
Run Code Online (Sandbox Code Playgroud)

我直接放在主要的开头.

为了完整性,我运行如下代码:

ludi@ludi-M17xR4:~/Desktop/tests$ g++ -o minicombo.x minicombo.cc && ./minicombo.x
Run Code Online (Sandbox Code Playgroud)

Bla*_*ace 5

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

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

  • @Ludi:我的猜测是,在输入函数范围时,会留出局部变量(包括那些数组)的空间.即使函数调用出现在数组定义之前,我也不相信语言需要在执行数组之前执行`printf`.当然,段错误也可能阻止任何缓冲输出出现,这是一个灾难性的事件. (2认同)