这段代码在哪里出现分段错误

Where does this code segfault?

本文关键字:分段 错误 在哪里 段代码 代码      更新时间:2023-10-16

我的问题,现在减少到一个-希望-最小的例子,是为什么下面的代码段错误。

如果你找到了后一个问题,它当然可以被看作是被提议问题的重复。问题是,我在最初的搜索中没有找到问题,很多新手也可能没有找到问题,不知道错误的原因。我认为这是我能找到的副本:

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

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

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