小弟最近在学指针,刚学到空类型指针 发现 只要申请1个字节的空间居然可以赋值20个字节的内容 而且都没报错 这是为什么呢?
void *p = malloc(1); //给空类型指针分配20个字节
int *px = (int*)p; //把空类型指针地址赋值给int指针
for (int i = 0; i < 5; i++) {
px[i] = i+10;
}
for (int i = 0; i < 5; i++) {
printf("\r\n%d",px[i]);
}
printf("%x",px);
编译器不检查越界。不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。无论界外的空间是否有被利用,我们都可以访问那块内存。
于是,即使没有定义
a[-1]
或者a[i]//(i>a.lenghth(),也可以访问
。编译阶段从
a
取首地址,然后根据下标取偏移量,得到*(a+i)这块内存。不检查越界问题的好处有:
1. 检查的话编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,导致程序的运行速度下降
2. 更加自由