当前位置: 首页 > 知识库问答 >
问题:

数组在C中允许越界访问?[重复]

贺浩漫
2023-03-14

这里是Java/C开发者。试图学习C语言,但我对数组的内存分配感到困惑。

这里发生了什么?

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int main()
{
    int az[3];
    az[2] = 66;
    az[8] = 5214;

    printf("%d\n", az[8]);

    system("pause");
    return 0;
}

输出

5214

怎么会这样?为什么我不能越界异常或程序崩溃?我能无限地做到这一点吗?在这种情况下,我的数组长度是多少?如果我的数组允许我将值放在界限之外,那么通过malloc分配内存有什么意义?这对我来说毫无意义。

共有1个答案

马博学
2023-03-14

C不执行任何边界检查。用索引8索引长度为3的数组可能(看起来)工作得很好,可能会微妙地损坏程序使用的其他内存,或者可能会导致立即的分段错误,具体取决于该数组在内存中的布局。

这种类型的错误可以称为“缓冲区溢出”,是安全漏洞的常见原因,因为在索引之前不检查数组的边界可能会导致在运行时对程序进行恶意修改。

欢迎来到疯狂而激动人心的C代码世界!

 类似资料:
  • 本文向大家介绍C++中new的越界访问问题,包括了C++中new的越界访问问题的使用技巧和注意事项,需要的朋友参考一下 今天敲代码的时候发现了一个BUG和大家分享一下,希望大家下次不要犯和我一样的错误。 如果犯了和我一样的错,也能知道自己错在哪里! <(^-^)> 函数如下:(斐波那契数列的实现) 上面的程序有BUG,如果传给函数的参数是0,程序就会因为触发一个断点而崩溃。 单步调试,根据内存窗口

  • 我使用String[3]数组来存储来自4个JTextFields的用户输入,然后将该数组输出到一个txt文件: 有人能告诉我为什么我会得到异常“数组索引越界”吗?谢谢。

  • 在数组边界之外访问数组(在C语言中)有多危险?有时会发生这样的情况:我从数组外部读取(我现在明白了,我然后访问程序的其他部分甚至其他部分使用的内存),或者我试图将值设置为数组外部的索引。程序有时会崩溃,但有时只是运行,只会给出意想不到的结果。 现在我想知道的是,这到底有多危险?如果它损害了我的程序,也不是那么糟糕。另一方面,如果它破坏了我程序之外的一些东西,因为我不知何故设法访问了一些完全无关的内

  • 此代码在GCC中编译良好并产生正确的结果。但是,我不确定它是否调用未定义的行为。 谢了!

  • 指针越界访问举例 我们都知道const修饰的是一个常量,是不可以被改变的量。但是在C语言中,它也许是一个中看不中用的修饰符。它是希望我们不去改变它的值,但是实际上C却不能阻止我们去修改它。和C++,Java不同,C++中的const就不能被改变。C中就并没有这种强化,当然也有它的道理。下面我们来看一个例子操作一下const常量: 测试代码如下 我们试图去修改一个常量的值。 运行结果如下 由于我们已

  • 我一直在四处寻找是否有任何东西可以帮助我,但我不太了解人们的回答,任何我所了解的似乎都不能解决问题!所以基本上正如标题所说,我得到了一个数组索引越界异常,但我不知道为什么。非常感谢任何帮助。 代码: