【问题标题】:(C) Why can I access array elements beyond the given limit? [duplicate](C) 为什么我可以访问超出给定限制的数组元素? [复制]
【发布时间】:2018-09-20 16:01:33
【问题描述】:

所以我已经学习 C 大约一年多了,在我的学习中我从未想过这是可能的:

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

int main()
{
    struct exterior
    {
        int x;
    } *ptr;

    ptr = (struct exterior *)malloc(sizeof(struct exterior[3]));
    ptr[0].x = 1;
    ptr[1].x = 2;
    ptr[2].x = 3;
    ptr[3].x = 4;
    ptr[4].x = 5;
    ptr[5].x = 6;

    printf("%d %d %d %d %d %d", ptr[0].x, ptr[1].x, ptr[2].x, ptr[3].x, ptr[4].x, ptr[5].x);

    return 0;
}

所以一开始我遵循C的规则;我将 3 个结构数组元素所需的内存分配给了一个结构指针。我使用指针来访问结构中的变量,同时使用索引来指定结构数组元素。

出于某种原因,然后我决定尝试访问超出给定限制的数组元素,即使我知道结果可能是程序崩溃,但我还是这样做了。

令我惊讶的是,没有崩溃。

相反,该程序有效。它打印出我给变量的值,没有问题。这怎么可能?

后来,我尝试使用 int 数组。它也有效!我做错了吗?

【问题讨论】:

  • 请尝试在任何搜索引擎上搜索...
  • 这个程序所做的只是在相邻的内存位置写入数据,但是accessing memory beyond the array boundaries is undefined behavior
  • 所以,即使有可能,我也不应该这样做,因为这只是它不打算做的事情?
  • C 不会阻止你朝自己的脚开枪。如果你告诉它在随机内存中大便,它会的。你得到的结果是任何人的猜测。

标签: c arrays pointers malloc structure


【解决方案1】:

当您在 C 上创建数组时,程序会为此分配所需的内存并为您提供第一个元素的指针。因此,当您说数组 [0] 时,您所做的是将 0 与该数组的基指针相加,因此数组 [1] 将 1(更准确地说是 4 个字节)增加到初始指针,因此您可以看到2个元素等等(不要忘记数组是一段连续的内存,每个值都在他的前一个值旁边)。如果你试图到达数组之外的一个位置,程序不会崩溃,它会从它指向的地方读取内存,在大多数情况下这很可能是垃圾,但 C 没有问题,这种语言几乎可以让你做任何事情!

希望对你有帮助:)

【讨论】:

  • 数组不是指针!例如。 int a[10]; 没有声明指针。越界访问数组的行为是未定义的。它可能会崩溃,也可能不会,它可能会烧毁你的房子或吃掉猫。这就是未定义的行为的想法。试图解释为什么代码以特定方式运行或推测是没有用的。一旦你调用 UB,你就超出了语言规范。该语言不可能“允许一切”。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2018-04-11
  • 1970-01-01
  • 2013-11-13
  • 2011-10-10
相关资源
最近更新 更多