一、什么是未定义行为?
未定义行为(Undefined Behavior)是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。
一句话,未定义行为就是运行结果不确定,可能运行成功,可能失败,可能结果不同
二、未定义行为的例子
大家只要正确的写代码就行,别搞这些未定义的行为。
1. 指针的未定义行为:
解引用空指针 |
解引用没被初始化的指针(野指针) |
使用指向生命周期已结束的对象的指针 |
指针的越界访问 |
2. 其他未定义行为
有符号的整数的算数溢出 |
数组越界访问 |
访问未初始化的变量 |
对字符串常量进行修改 |
对于有返回值的函数,不返回返回值 |
变量同时是左值和右操作数 |
输出语句中的无顺序打印(这里特指此类printf( "%d %d" ,++i , --i );) |
C++中的new / delete,new [ ] / delete [ ],malloc / free 没有配对使用 |
参考博客:洛谷日报:关于 C++ 未定义行为的一些事 - 知乎