在编写 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/