(C) 为什么我可以访问超出给定限制的数组元素



所以我学习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数组尝试了它。它也奏效了!我做错了什么吗?

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

希望对:)有所帮助

相关内容

  • 没有找到相关文章

最新更新