数组如何绕过其声明的长度[重复]

Posted

技术标签:

【中文标题】数组如何绕过其声明的长度[重复]【英文标题】:How does arrays bypass its declared length [duplicate] 【发布时间】:2019-12-15 01:30:56 【问题描述】:

我正在练习 c 中的数组逻辑,如果您将数组长度声明为 10 个整数,我对数组长度声明的想法是不可格式化的,该数组无法在内存中保留 20 个整数,但是当我测试它时,我看到我完全错了

int main()
    int i;
    int arr[10];
    for (i = 0;i<20;i++)
        arr[i] = i;
    
    for (i = 0;i<20;i++)
        printf("%d \n",arr[i]);
    



我原以为会看到 10 个打印数字,但打印出 20 个,有人能解释一下这怎么可能吗?

【问题讨论】:

它只是计算基数后面的第 20 个 int 的地址并尝试打印它..无论它是否是有效的数组元素。 (或者它会导致其他未定义的行为,例如中止您的程序)。 您期望什么?它除了计算地址之外什么都不做。不传递数组的末尾由您决定。 不,你完全正确。 C 和 C++ 都不会检查您是否访问超出大小的数组元素。只是UB。如果你幸运的话,你的应用程序会崩溃。否则,您可能会得出错误的结论... ;-) 你没有“完全错误”,一点也不。如果您的期望是当您超出数组的边界时会收到一条明确的错误消息,那么您可能有点 错了。可以这样想:“我以为红灯时你不能通过十字路口。但过去一周的每个晚上我都在这样做(凌晨 2 点),没有发生任何不好的事情。我想我完全错了。” 请不要通过擦除内容来破坏您的帖子。发布后,您的内容立即获得许可,可在 CC by-SA 4.0 下使用(需要注明出处)。 【参考方案1】:

C 和 C++ 对数组大小没有明确的边界检查。当您读/写超出数组末尾时,您调用undefined behavior。

由于未定义的行为,您的程序可能会崩溃,它可能会输出奇怪的结果,或者(如您的情况)它可能看起来正常工作。此外,进行看似无关的更改,例如添加未使用的局部变量或添加printf 进行调试,可能会改变 UB 的表现方式。

程序可能会崩溃并不意味着它会崩溃。

【讨论】:

以上是关于数组如何绕过其声明的长度[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在变量声明 (CS0270) 中强制执行数组的长度?

OpenCL中不允许使用可变长度数组声明 - 为什么?

如何声明和定义具有多个可变长度数组的结构?

如何在方法中声明数组[重复]

什么情况下使用break关键字? 什么情况下使用Continue关键字? Java如何声明一个数组?JS如何声明一个数组?如何获取数组长度? 如何遍历数组?

为啥在c ++中声明一个全局数组时,它可以给出的大小大于在main中声明它[重复]