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故障,我不明白为什么.
事实证明,问题是我试图在我的堆栈中存储大的东西,有没有办法检测到这个?或者至少检测到它出错了?
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)
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |