这段代码在哪里出现段错误?
Where does this code segfault?
我的问题现在简化为 - 希望 - 最小的例子,是为什么以下代码会出现段错误。
当然可以将其视为所提出问题的副本,前提是您找到了后者。问题是,我在最初的搜索中没有找到问题,许多新手可能也不知道错误的原因。我建议将其作为我可以找到的副本:
Segmentation Fault before main
但是问题描述很长,所以我相信我的最小化和更短的代码可能更能说明问题。无论如何,它都是重复的。 我建议版主将其设置为重复项,并将 link 从第二个可能的重复项设置为第一个。
#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 的阵列,具有自动存储持续时间 ("on the stack")。您有多种选择。
- 使用
std::vector<double>
创建所需大小或 resize()
成员函数。
- 使用
std::unique_ptr<double[]>
或 new[]/delete[]
的动态分配。当心,手动内存管理充满了危险。
- 使数组
static
或全局。
我的问题现在简化为 - 希望 - 最小的例子,是为什么以下代码会出现段错误。
当然可以将其视为所提出问题的副本,前提是您找到了后者。问题是,我在最初的搜索中没有找到问题,许多新手可能也不知道错误的原因。我建议将其作为我可以找到的副本:
Segmentation Fault before main
但是问题描述很长,所以我相信我的最小化和更短的代码可能更能说明问题。无论如何,它都是重复的。 我建议版主将其设置为重复项,并将 link 从第二个可能的重复项设置为第一个。
#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 的阵列,具有自动存储持续时间 ("on the stack")。您有多种选择。
- 使用
std::vector<double>
创建所需大小或resize()
成员函数。 - 使用
std::unique_ptr<double[]>
或new[]/delete[]
的动态分配。当心,手动内存管理充满了危险。 - 使数组
static
或全局。