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

索引过去结束的C数组[重复]

柯冯浩
2023-03-14

我用C语言写了一个简短的程序,只是为了看看当索引超过数组的末尾时会发生什么。

我发现它主要产生随机值(我知道它们实际上不是随机的),直到一个点(在本例中,52个索引超过末尾),它每次产生0。每一个值超过这一点,程序就会崩溃。这是为什么?是程序分配的内存空间结束了吗?

main()
{
    int ar[4];
    ar[0] = 99;
    ar[1] = 45;
    printf("array: %d, %d   random value: %d", ar[0], ar[1], ar[55]);
}

编辑:我还发现,如果我修改这个值,结果总是0(即ar[55]=1000),那么程序的返回码就会上升。

共有2个答案

匡凌
2023-03-14

访问超出数组边界的数组元素(在0之前或从其大小开始)是未定义的行为。它可能会产生值,也可能不会产生值,可能会导致程序突然结束,可能会导致系统停止、重新启动或起火。。。

即使是在未定义的内存空间内,现代系统也会尝试限制用户的行为,但会限制用户空间:

  • 起搏器干扰其计时值可能导致过早死亡
  • 溢出数组边界的银行软件可能会覆盖帐户余额信息,将不计其数的美元存入某个随机帐户
  • 你的自动驾驶汽车可能比酒后驾车的人表现得更糟
  • 想想核电站控制软件、飞机仪表、军事设备

毫无疑问,应该避免未定义的行为。

关于退出状态,您的程序为main()的定义使用了一个过时的语法,隐式返回类型,在C99和更高版本中不再支持,但不返回任何东西,这意味着它的返回值可以是任何随机值,包括每个执行的不同值。C99为main()函数指定了一个笨拙的语法,并强制在main()的结尾处返回一个隐式的0;,但依赖它是糟糕的风格。

类似地,在没有适当原型的情况下调用printf(),也是未定义的行为。你应该包括

最后,ar[0]ar[1]main()中初始化,但是ar[2]ar[3]没有初始化。请注意,访问未初始化的值也有未定义的行为。这些值可以是任何值,可以被描述为随机值,但在某些系统上,它们可能是陷阱值,仅通过读取它们就会导致未定义的行为。

在简单和复杂的程序中,有一些非常方便的工具可以用来跟踪这种问题,最著名的是valgrind。如果你对这个主题很好奇,你绝对应该看看它。

蒲坚
2023-03-14

...只是为了看看当你索引超过数组的末尾时会发生什么

内存不足,试图调用未定义的行为。任何事都有可能发生,任何事都有可能。

在您的情况下,由于某种原因,索引52的内存地址可以从进程访问,因此它允许访问。索引超过52指向未分配给进程地址空间的内存区域,因此会引发访问冲突,导致分段故障。这根本不是确定性行为,也不可能依赖调用UB的程序的输出。

 类似资料:
  • 本文向大家介绍javascript数组去重小结,包括了javascript数组去重小结的使用技巧和注意事项,需要的朋友参考一下 前言 最近为了换工作,准备下面试,开始回顾复习JavaScript相关的知识,昨天下午想到了数组去重的相关方法,干脆整理出几篇JavaScript算法文章,以备后用,此系列文章不定篇数,不定时间,想到哪写到哪,不保证正确性,不保证高效率,只是谈谈个人理解,如有错误,请诸位

  • 本文向大家介绍js数组去重的方法总结,包括了js数组去重的方法总结的使用技巧和注意事项,需要的朋友参考一下 一、普通的方法去重 1、简单的去重方法 2、数组下标法 3、排序后相邻去除法 4、优化遍历数组法 5.数组includes()去重 6.数组原型对象上的filter和includes方法 7.数组原型对象上的forEach和includes方法 二、原型对象去重 方法一: 思路:1)构建一个

  • 问题内容: 我有一系列元素。我还有一个IndexSet,它指定需要将数组的哪些索引提取到新数组中。例如: 我正在寻找使用swift 函数的方法,但是还没有答案。我怎样才能做到这一点? 问题答案: 是递增整数的集合,因此可以 将 每个索引 映射 到相应的数组元素: 假定所有索引对于给定数组均有效。如果不能保证,则可以过滤索引(如@dfri正确标记):

  • 问题内容: 我有我必须取消一些索引的数组,所以现在看起来像 如您所见,[2]丢失了,我需要做的就是重置索引,因此它们显示为[0]-[3]。 问题答案: 使用。

  • 在C++中是否很好地定义了取消引用指向数组类型的一个结束指针? 请考虑以下代码: 通常的看法是,取消引用一个经过一个结束的指针是一种未定义的行为。但是,这对于指向数组类型的指针是否成立呢? 编辑:这个问题不是通过下标获取一个数组元素的地址的重复:根据C++标准是否合法?我在问问题中解释的规则是否也适用于指向数组类型的指针。 编辑2:删除以明确表示不是。

  • 更新!现在,我已经修复了原来的问题,但结果是,我在显示最年轻和最老的成员时出错,并抛出以下错误。有什么建议吗?谢谢 线程“main”java中出现异常。lang.IndexOutOfBoundsException:索引:4,大小:4,java。util。ArrayList。java上的rangeCheck(ArrayList.java:653)。util。ArrayList。获取(ArrayLis