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

时间:2018-04-10 22:23:22

标签: c arrays pointers malloc structure

所以我一直在学习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数组。它工作得很好!我做错了吗?

1 个答案:

答案 0 :(得分:0)

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

希望有所帮助:)