小弟最近在学指针,刚学到空类型指针发现只要申请1个字节的空间居然可以赋值20个字节的内容而且都没报错这是为什么呢?void*p=malloc(1);//给空类型指针分配20个字节int*px=(int*)p;//把空类型指针地址赋值给int指针for(inti=0;i
2 回答
qq_遁去的一_1
TA贡献1725条经验 获得超7个赞
编译器不检查越界。不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。无论界外的空间是否有被利用,我们都可以访问那块内存。于是,即使没有定义a[-1]或者a[i]//(i>a.lenghth(),也可以访问。编译阶段从a取首地址,然后根据下标取偏移量,得到*(a+i)这块内存。不检查越界问题的好处有:1.检查的话编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,导致程序的运行速度下降2.更加自由
GCT1015
TA贡献1827条经验 获得超4个赞
这样做无疑不太合理,C语言设计的很自由,它认为编程员应该清楚自己在做什么。这跟C语言不检查数组越界一样,这种问题是设计理念的问题,自己注意不要这么做就是了。
添加回答
举报
0/150
提交
取消