C++ 默认数组初始化时出现分段错误

C++ 默认数组初始化时出现分段错误,c++,C++,Linux中存在堆栈大小的默认值,如果超过该值,则会发生分段错误 为什么分段错误没有出现在第一个错误上,而是出现在第二个错误上,下面只有一行默认数组初始化?都是用g++-O0编译的 需要说明的是,ltrace在第二个上没有观察到堆分配,并且在第三个上进行分配操作时,分段错误会如预期的那样发生 (一) (二) 即使是w/o优化,g++也会使用-Wunused variable选项在第一个变量上警告未使用的变量arr,并且在为数组分配堆栈空间后,objdump显示初始化不会继续 然而,第二个程序没有

Linux中存在堆栈大小的默认值,如果超过该值,则会发生分段错误

为什么分段错误没有出现在第一个错误上,而是出现在第二个错误上,下面只有一行默认数组初始化?都是用g++-O0编译的

需要说明的是,ltrace在第二个上没有观察到堆分配,并且在第三个上进行分配操作时,分段错误会如预期的那样发生

(一)

(二)

即使是w/o优化,g++也会使用-Wunused variable选项在第一个变量上警告未使用的变量arr,并且在为数组分配堆栈空间后,objdump显示初始化不会继续

然而,第二个程序没有收到任何警告,即使它有那行逻辑上无效的代码。不仅为数组分配堆栈空间,而且对项进行隐式初始化,从而最终导致运行时分段错误

第三个操作上的操作
=
试图将数组大小分配给堆栈限制之外的另一个存储位置,因此当然也会导致分段错误

根据报告:

隐式初始化

如果未提供初始值设定项:

具有自动存储持续时间的对象初始化为 不确定值(可能是陷阱表示)

初始化具有静态和线程本地存储持续时间的对象 详情如下:

指针初始化为其类型的空指针值

整数类型的对象初始化为无符号零

浮动类型的对象初始化为正零

数组、结构和联合的成员按所述进行初始化 上面递归地加上所有填充位初始化为零


从g++的角度来看,第一个属于具有自动存储持续时间的对象,第二个属于具有线程本地存储持续时间的对象。

堆栈与堆是一个需要学习的重要区别。第一个分配的字节比允许的字节大,第二个分配的大小(std::shared\u ptr)*比允许的字节大。共享\u ptr的大小至少为sizeof(uintptr\u t)+链路计数器。所以,可能,大于允许值的值并没有那么大。此外,与一些奇怪的智能指针数组相比,编译器可能更容易优化[删除]字符数组。@sweenish,与问题无关。
int main() {
    char arr[larger_than_allowed];
}
#include <memory>

int main() {
    std::shared_ptr<char> arr[larger_than_allowed];
}
int main() {
    char arr[larger_than_allowed];
    int nums = sizeof(arr);
}