C中的未定义行为是什么?
我正在使用GCC编译器。在某些情况下,虽然程序的输出应该是未定义的,但我得到了正确的值。我多次运行这些程序。但结果是一致的。而对于其他一些程序,结果是不确定的。那么,在哪些情况下我应该考虑程序行为是否真的未定义?对此有什么样的规则吗?
答案 0 :(得分:2)
未定义行为的定义:
C11(ISO / IEC 9899:201x)§3.4.3
1个未定义的行为
行为,在使用非便携或错误的程序结构或错误数据时,本国际标准不对其施加任何要求
2注意可能的未定义行为包括完全忽略具有不可预测结果的情况,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式行事,终止翻译或执行(发出诊断信息)。
3示例未定义行为的示例是整数溢出的行为。
在C11§J.2未定义的行为
中还有未定义行为的列表答案 1 :(得分:1)
答案 2 :(得分:1)
我认为,简单来说,如果指令的行为不能保证在所有编译器或所有情况下保持一致,则可以将其视为未定义的行为。
答案 3 :(得分:0)
未定义的行为意味着编译器可以发出它喜欢的任何代码。您的程序可能会显示您期望的结果,或者可能会格式化您的硬盘,或者它可以开始向塔利班发送电子邮件。任何事情都可能发生
答案 4 :(得分:0)
这可以通过一个例子来说明,
#include "stdio.h"
int *ptr;
void func2()
{
int k = 300;
}
void func1()
{
int t = 100;
ptr = &t;
}
int main(int argc, char *argv)
{
func1();
printf("The value of t=%d\r\n",*ptr);
func2();
printf("The value of t=%d\r\n",*ptr);
}
On my machine, I got the following.
joshis1@(none) temp]$ ./ud.out
The value of t=100
The value of t=300
这表明t的值不能保证。一旦t的范围结束,堆栈空间就分配给k。因此,ptr访问相同的地址 - 内存位置。但变量范围已经结束。如果你不调用func2(),你将得到一致的结果;因此,编译器不保证结果 - >这称为未定义的行为。