我的问题(现在希望简化为一个最小的示例)是为什么下面的代码出现段错误。
如果您已经找到了所建议的问题,那么当然可以将其视为重复的问题。问题是,我在最初的搜索中找不到问题,因此可能有很多新手,不知道错误原因。我建议将其作为我可以找到的副本:
但是问题描述很长,因此我认为最小化和短得多的代码可能更好地说明了问题。无论如何,它都是重复的。我建议主持人将此设置为重复项,并设置从第二个可能的重复项到第一个重复项的链接。
#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阵列。您有几种选择。
std::vector<double>
创建时具有所需大小或resize()
成员函数。std::unique_ptr<double[]>
或动态分配new[]/delete[]
。当心,手动内存管理充满了危险。static
或全局数组。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句