【问题标题】:Array upper bound cecking in C language [duplicate]C语言中的数组上限检查[重复]
【发布时间】:2014-10-02 23:41:28
【问题描述】:

在 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]);
} 

【问题讨论】:

  • 你能发布你的代码吗?
  • 没有任何代码很难说。通常,如果您越界访问数组,则所有赌注都将关闭。您有责任注意不要这样做。
  • 您能否给我们您的代码或插入元素的位置的 sn-p,因为这非常模棱两可
  • 如果本地数组的情况 - 堆栈溢出(多么讽刺)......在全局数组的情况下 - 覆盖其他一些全局数据,或者执行非法内存访问......
  • @barakmanos:我认为您可能将堆栈溢出与堆栈粉碎混淆了。它们并不完全相同。

标签: c arrays


【解决方案1】:

因为 C 不做任何数组边界检查。作为程序员,您有责任确保您的索引不会越界。

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

【讨论】:

    【解决方案2】:

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

    您所描述的是导致undefined behavior 的一整类编程错误的示例。来自维基百科:

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

    这意味着允许程序以任何它喜欢的方式行为不端(或不行为)。

    在实践中,当您写超出数组末尾时,很可能会发生以下任何情况:

    • 程序立即或稍后崩溃。
    • 其他不相关的数据被覆盖。这可能会导致任意的不当行为和/或严重的security vulnerabilities
    • 用于跟踪已分配内存的内部数据结构被越界写入损坏。
    • 该程序的工作方式就像一开始就分配了更多内存一样(内存通常是按块分配的,幸运的是,在数组结束后可能恰好有一些空闲容量)。

    (这不是一个详尽的列表。)

    存在一些工具,例如 Valgrid,可以帮助发现和诊断此类错误。

    【讨论】:

      【解决方案3】:

      C 语言标准并未规定应如何在内存中分配变量。

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

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

      • 在局部数组的情况下,您将覆盖其他一些局部变量或执行非法内存访问操作。

      • 在全局数组的情况下,您将覆盖其他一些全局变量或执行非法内存访问操作。

      【讨论】:

        猜你喜欢
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多