最近在学C的指针,为什么申请一个字节的空间缺可以放多个内容呢
小弟最近在学指针,刚学到空类型指针 发现 只要申请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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
编译器不检查越界。不允许数组下标越界,并不是因为界外没有存储空间,而是因为界外的内容是未知的。无论界外的空间是否有被利用,我们都可以访问那块内存。
于是,即使没有定义
a[-1]
或者a[i]//(i>a.lenghth(),也可以访问
。编译阶段从
a
取首地址,然后根据下标取偏移量,得到*(a+i)这块内存。不检查越界问题的好处有:
1. 检查的话编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,导致程序的运行速度下降
2. 更加自由
这样做无疑不太合理,C语言设计的很自由,它认为编程员应该清楚自己在做什么。这跟C语言不检查数组越界一样,这种问题是设计理念的问题,自己注意不要这么做就是了。
对
未定义行为
来说,报不报错,崩不崩溃,都很正常,因为他叫未定义行为
。其实你已经使用了别的地址了,只是你自己没发现而已,而编译器是默认你自己是知道的
已经在非法访问内存了,不过越界19个字节不算太多,暂时没有引发什么重大问题而已,毕竟不是所有的内存访问都会引起程序崩溃,有些错误没法显示表达出来
你会发现其实下面一段代码正常编译,而且输出的结果没有异常
但是!
你这样做是非法访问内存!在实际中会造成不可估计的后果!
为了更能说明问题 我修改了一下代码
结果如图
现在你意识到问题的严重性了吧?
你出现的问题,就是这个网站模仿的那个网站的名字
c语言是比较随意的语言 虽然可以运行成功 但是这种做法绝对 一次成功并不代表绝对没问题!
能够编译通过,并且运行结果看起来正确的代码,并不代表里面不是“藏污纳垢”的!