检测到堆栈已满

Mar*_*sen 6 c++ stack-overflow stack segmentation-fault

在编写C++代码时,我了解到使用堆栈存储内存是个好主意.

但最近我遇到了一个问题:

我有一个实验,其代码如下所示:

void fun(const unsigned int N) {
    float data_1[N*N];
    float data_2[N*N];

    /* Do magic */
}
Run Code Online (Sandbox Code Playgroud)

代码随机抽取了一个seqmentation故障,我不明白为什么.

事实证明,问题是我试图在我的堆栈中存储大的东西,有没有办法检测到这个?或者至少检测到它出错了?

Naw*_*waz 5

float data_1[N*N];
float data_2[N*N];
Run Code Online (Sandbox Code Playgroud)

这些是可变长度数组(VLA),因为N它不是常量表达式.参数中的常量仅确保它N是只读的.它不告诉编译器N是常量表达式.

仅在C99中允许VLA; 在其他版本的C和所有版本的C++中,它们是不允许的.但是,一些编译器提供VLA作为编译器扩展功能.如果你正在使用GCC进行编译,那么尝试使用-pedantic选项,它会告诉你它是不允许的.

既然你的程序为什么会出现segfault,可能是因为堆栈溢出由于大的值N * N:


考虑使用std::vectoras:

#include <vector> 

void fun(const unsigned int N) 
{
  std::vector<float> data_1(N*N);
  std::vector<float> data_2(N*N);

  //your code
}
Run Code Online (Sandbox Code Playgroud)

  • @ SPIRiT_1984:事实上,从一开始就使用`malloc`是个坏主意.需要动态数组时使用`std :: vector`.当你有*非常强烈的理由*时,使用`malloc/new`并自己管理内存. (3认同)
  • const函数参数在此处不会更改任何内容,该值仍然只在运行时已知,因此您仍然依赖于编译器扩展.无论如何它是C或C++,重点是 - 如果你需要大量内存,请使用堆(通过`std :: vector`). (2认同)