我认为数组被视为静态数据结构。
然后我们执行这个:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[5] = {10,20,30,40,50};
a[5] = 100;
a[6] = 200;
printf("Out of bounds %d, %d", a[5], a[6]);
return 0;
}
这将返回Out of bounds 100 200
并正常结束。为什么?
如果是静态的,为什么会声明并正常返回 200 a[5]
?
一切都让我得出结论:gcc 将数组视为动态数据结构。
我说得对吗?发生了什么事?
静态数组在编译时具有固定大小,而可变长度数组在运行时具有固定大小。编译器在运行时不对数组执行边界检查。
由于您访问的数组超出了范围,因此您的代码具有未定义的行为,因此实际上任何事情都可能发生,包括看似可以正常工作的代码。
当您越界访问数组时,编译器不会在运行时动态调整数组的大小。您只是通过在数组外写入来破坏周围的内存。在您的示例中,您的代码不会崩溃,因为它正在访问有效内存,但它仍然是数组不拥有的内存。