(C) 为什么我可以访问超出给定限制的数组元素?
(C) Why can I access array elements beyond the given limit?
所以我已经学习 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 上创建数组时,程序会分配您需要的内存并为您提供第一个元素的指针。所以当你说数组 [0] 时,你所做的是将 0 加到该数组的基指针上,因此数组 [1] 增加 1(更准确地说是 4 个字节)到初始指针,所以你可以看到2个元素等等(别忘了数组是一段连续的内存,每个值都紧挨着他的前一个)。如果你试图到达数组之外的位置,程序不会崩溃,它会做的是从它指向的地方读取内存,在大多数情况下这很可能是垃圾,但 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 上创建数组时,程序会分配您需要的内存并为您提供第一个元素的指针。所以当你说数组 [0] 时,你所做的是将 0 加到该数组的基指针上,因此数组 [1] 增加 1(更准确地说是 4 个字节)到初始指针,所以你可以看到2个元素等等(别忘了数组是一段连续的内存,每个值都紧挨着他的前一个)。如果你试图到达数组之外的位置,程序不会崩溃,它会做的是从它指向的地方读取内存,在大多数情况下这很可能是垃圾,但 C 没有问题,这种语言几乎可以让你做任何事情!
希望对您有所帮助:)