c++ - 检测栈满

标签 c++ stack segmentation-fault stack-overflow

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

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

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

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

    /* Do magic */
}

代码随机出现了一个 seqmentation 错误,我不知道为什么。

原来问题是我试图在我的堆栈上存储太大的东西,有没有办法检测到这个?或者至少检测到它出了问题?

最佳答案

float data_1[N*N];
float data_2[N*N];

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

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

现在为什么你的程序出现段错误,可能是因为 stack-overflow由于 N * N 的值很大:


考虑将 std::vector 用作:

#include <vector> 

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

  //your code
}

关于c++ - 检测栈满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11079844/

相关文章:

c++ - 在 OpenCV 中播放 AVI 文件

c++ - 为什么在 C++ 中为执行线程从未遇到过的局部变量声明分配堆栈空间?

c++ - 程序在哪里为抛出对象分配内存?

c - 使用堆栈实现根据最后更新日期跟踪所有文件

c - GDB 线程进程的怪癖

linux - 在 Linux 中处理 SIGSEGV?

c++ - 关于指针指针的混淆

c++ - 如何声明 constexpr C 字符串?

c++ - 遍历未知大小的数组 C++

c - 在 C 中访问和修改字符串 (char*) 数组时出现段错误