什么时候程序会在缓冲区溢出的情况下崩溃
#include<stdio.h> #include<stdlib.h> main() { char buff[50]; int i=0; for( i=0; i <100; i++ ) { buff[i] = i; printf("buff[%d]=%d\n",i,buff[i]); } }
分配的前50个字节会发生什么,程序什么时候会崩溃?
我在UBUNTU中看到了gcc a.out,当我99时它崩溃了
>> buff[99]=99 *** stack smashing detected ***: ./a.out terminated Aborted (core dumped) <<
我想知道为什么在for循环中在buff [51]上发生赋值时这不会崩溃?
解决方法@H_301_14@
它是
undefined behavior.你永远无法预测崩溃的时间(或者根本不可能),但你不能依赖它“不崩溃”并编写应用程序代码.
推理
基本原理是c数组中没有编译或运行时’索引超出绑定检查’.这存在于STL向量或其他更高级语言的数组中.因此,每当程序访问超出分配范围的内存时,它取决于它是否只是破坏程序堆栈中的另一个字段或影响另一个程序或其他内容的内存,因此永远无法预测仅在极端情况下发生的崩溃.它只会在强制操作系统干预的状态下崩溃,或者当程序无法正常运行时崩溃.
例
假设你在一个函数调用中,紧接着你的数组旁边是RETURN地址,即程序用来返回它调用函数的地址.假设您已损坏,现在您的程序尝试返回损坏的值,该值不是有效地址.因此它会在这种情况下崩溃.
推理
基本原理是c数组中没有编译或运行时’索引超出绑定检查’.这存在于STL向量或其他更高级语言的数组中.因此,每当程序访问超出分配范围的内存时,它取决于它是否只是破坏程序堆栈中的另一个字段或影响另一个程序或其他内容的内存,因此永远无法预测仅在极端情况下发生的崩溃.它只会在强制操作系统干预的状态下崩溃,或者当程序无法正常运行时崩溃.
例
假设你在一个函数调用中,紧接着你的数组旁边是RETURN地址,即程序用来返回它调用函数的地址.假设您已损坏,现在您的程序尝试返回损坏的值,该值不是有效地址.因此它会在这种情况下崩溃.