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

C语言中的数组上界检查[复制]

孟英锐
2023-03-14

在c程序中,我们可以初始化一个数组,比如int-array[10]。所以它可以存储10个整数值。但当我使用循环给出输入时,它接受的输入超过10个,并且没有显示任何错误。到底发生了什么??

#include<stdio.H>
main()
{
 int array[10],i;
 for(i=0;i<=11;i++)
 scanf("%d",&array[i]);
 for(i=0;i<10;i++)
 printf("%d",array[i]);
} 

共有3个答案

董权
2023-03-14

C语言标准没有规定如何在内存中分配变量。

因此,理论上的答案是,您正在执行不安全的内存访问操作,这将导致未定义的行为(任何情况都可能发生)。

然而,从技术上讲,所有编译器都在堆栈中分配局部变量,在数据部分分配全局变量,因此实际的答案是:

>

  • 在本地数组的情况下,要么重写其他一些本地变量,要么执行非法的内存访问操作。

    对于全局数组,您将重写其他全局变量或执行非法的内存访问操作。

  • 吕胤
    2023-03-14

    执行任何数组边界检查都不需要C编译器和运行时。

    你所描述的是导致未定义行为的一整类编程错误的例子。来自维基百科:

    在计算机编程中,未定义行为是指其行为被指定为任意的计算机代码。

    这意味着该程序可以随心所欲地(或不)做出不当行为。

    在实践中,当写入超过数组末尾时,以下任何情况都有可能发生:

    • 程序会立即或稍后崩溃。
    • 其他无关的数据会被覆盖。这可能会导致任意不当行为和/或严重的安全漏洞。
    • 用于跟踪分配内存的内部数据结构因越界写入而损坏。
    • 该程序的工作原理就像在一开始就分配了更多的内存一样(内存通常是按块分配的,幸运的是,数组结束后可能会有一些剩余容量)。

    (这不是一份详尽的清单。)

    有一些工具,比如Valgrid,可以帮助发现和诊断这类错误。

    阴永福
    2023-03-14

    因为C不做任何数组边界检查。作为一名程序员,你有责任确保你的索引不超出范围。

    根据使用的编译器和代码运行的系统,您可能会从内存中读取随机数据,或者在读/写越界时最终得到SIGSEGV。

     类似资料:
    • 数组是编程语言中用来存储元素的集合。在 C 语言中,集合是储存相同类型元素的集合。并且可以通过一个名称来来访。 -------------------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | …… | N-1 | -------------------------------------------- 第一个元素

    • 数组是一种内存分配的形式,数组是定义了一个连续的空间,与指针类似。 数组定义方式 类型 数组名[数组大小];//类型为每个空间的大小,我们通过数组名和下标访问数据,数组名指向存储数据的首地址,但是我们不可以改变数组名指向的地址。数组大小只有在定义的时候生效,定义之后不可以被改变。 int a[100]; //申请了一个名叫a的数组,它包含了100个整型。 数组的访问 我们可以通过数组的下标访问数

    • 我一直在尝试用C语言编写一些碰撞检测代码,下面是我目前拥有的函数,它在每帧调用一次,但是由于某些原因,当两个精灵重叠时,碰撞不起作用 任何指向正确方向的指示都将不胜感激

    • 问题内容: 我正在尝试检查2D数组中每个元素的相邻值,但是当我到达数组的边或角落时,得到了IndexOutOfBoundsException。例如,如果我的数组是: | 2 | 4 | 2 | 7 | 8 | | 8 | 1 | 0 | 5 | 6 | | 0 | 3 | 1 | 5 | 2 | | 1 | 9 | 7 | 2 | 0 | 我知道8的所有邻居都是7,5和6,但是我的陈述并没有正确检

    • 本文向大家介绍C语言二维数组中的查找的实例,包括了C语言二维数组中的查找的实例的使用技巧和注意事项,需要的朋友参考一下 C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 思路描述:一个数字的下方和右方是比它本身大的区域,而左方和上方时比它本身小

    • C 语言中的多维数组与我们在数学中学习到的多维数组是一致的。如果你还不知道什么是多维数组也没有关系。多维数组可以看成是之前学习过的数组的扩展。它能让你完成一些仅仅依靠一维数组没有办法完成的事情。让很多事情完成的更为简单。 1. 多维数组的声明 多维数组可以看作是一维数组的扩展。所以,它的声明就是在之前学习的数组,也叫一维数组,之后继续添加大括号,如果添加一组大括号,那么称之为二维数组,以此类推,就