gpt4 book ai didi

c++ - 数组索引越界行为

转载 作者:行者123 更新时间:2023-11-30 17:53:38 31 4
gpt4 key购买 nike

为什么 C/C++ 在数组索引越界的情况下会有所不同?

#include <stdio.h>

int main()
{
int a[10];
a[3] = 4;
a[11] = 3; // Does not give a segmentation fault
a[25] = 4; // Does not give a segmentation fault
a[20000] = 3; // Gives a segmentation fault
return 0;
}

据我了解,在 a[11]a[25] 的情况下,它正在尝试访问分配给进程或线程的内存,并且它会超出堆栈a[20000] 情况下的边界。

为什么编译器或链接器不给出错误?他们不知道数组的大小吗?如果没有,那么 sizeof(a) 如何正确工作?

最佳答案

问题是 C/C++ 实际上并没有对数组进行任何边界检查。这取决于操作系统来确保您正在访问有效的内存。

在这种特殊情况下,您正在声明一个基于堆栈的数组。根据特定的实现,访问数组边界之外将简单地访问已分配的堆栈空间的另一部分(大多数操作系统和线程为堆栈保留内存的特定部分)。只要你碰巧在预先分配的堆栈空间中玩耍,一切都不会崩溃(注意我没有说工作)。

最后一行发生的情况是,您现在访问的内存超出了为堆栈分配的内存部分。因此,您将索引到未分配给进程或以只读方式分配的内存部分。操作系统看到这一点并向进程发送一个段错误。

这是 C/C++ 在边界检查方面如此危险的原因之一。

关于c++ - 数组索引越界行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15476025/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com