有默认的 杪 的堆栈大小,以 Linuxజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజజ 分段故障 如果超过了就会发生。
为什么会出现 分段故障 在第一条上不显示,但在第二条上却显示了,但下面只有一行默认的数组初始化。都是由 g++ -O0.
要清楚的是,在第二种情况下,没有观察到堆分配被 追踪和 分段故障 在第三种情况下,如预期的那样发生赋值操作。
1)
int main() {
char arr[larger_than_allowed];
}
2)
#include <memory>
int main() {
std::shared_ptr<char> arr[larger_than_allowed];
}
3)
int main() {
char arr[larger_than_allowed];
int nums = sizeof(arr);
}
甚至wo优化。g++ 警告 未使用的变量 arr 在第一个选项上 -未使用的变量和 objdump 显示在为数组分配了堆栈空间后,没有任何东西继续初始化。
但是,第二条即使有那行逻辑上的死代码,也没有收到任何警告。不仅为数组分配了堆栈空间,而且还对项目进行了隐式初始化,因此最后导致了 分段故障 在运行时。
的操作。=
在第三种情况下,试图将数组的大小分配到另一个超出堆栈限制的存储位置,因此肯定会导致 分段故障 也是。
据。参考:
隐式初始化
如果没有提供初始化器,则会将自动存储持续时间的对象初始化为不确定值(可能是陷阱表示)。
自动存储持续时间的对象被初始化为不确定的值(可能是陷阱表示)。
具有静态和线程本地存储持续时间的对象按如下方式初始化。
指针被初始化为其类型的空指针值。
积分类型的对象被初始化为无符号零。
浮动类型的对象初始化为正零。
数组、结构和联合体的成员按上述方法递归初始化,另外所有填充位初始化为零。
看来,第一个属于自动存储持续时间的对象,第二个属于线程本地存储持续时间的对象,以 g++.