缺省数组初始化时出现分段故障

问题描述 投票:-1回答:1

有默认的 的堆栈大小,以 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);
}
c++
1个回答
1
投票

甚至wo优化。g++ 警告 未使用的变量 arr 在第一个选项上 -未使用的变量objdump 显示在为数组分配了堆栈空间后,没有任何东西继续初始化。

但是,第二条即使有那行逻辑上的死代码,也没有收到任何警告。不仅为数组分配了堆栈空间,而且还对项目进行了隐式初始化,因此最后导致了 分段故障 在运行时。

的操作。= 在第三种情况下,试图将数组的大小分配到另一个超出堆栈限制的存储位置,因此肯定会导致 分段故障 也是。

据。参考:

隐式初始化

如果没有提供初始化器,则会将自动存储持续时间的对象初始化为不确定值(可能是陷阱表示)。

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

具有静态和线程本地存储持续时间的对象按如下方式初始化。

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

积分类型的对象被初始化为无符号零。

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

数组、结构和联合体的成员按上述方法递归初始化,另外所有填充位初始化为零。

看来,第一个属于自动存储持续时间的对象,第二个属于线程本地存储持续时间的对象,以 g++.

© www.soinside.com 2019 - 2024. All rights reserved.