什么是C中的未定义行为?

时间:2013-09-26 06:02:37

标签: c undefined-behavior

C中的未定义行为是什么?

我正在使用GCC编译器。在某些情况下,虽然程序的输出应该是未定义的,但我得到了正确的值。我多次运行这些程序。但结果是一致的。而对于其他一些程序,结果是不确定的。那么,在哪些情况下我应该考虑程序行为是否真的未定义?对此有什么样的规则吗?

5 个答案:

答案 0 :(得分:2)

未定义行为的定义:

  

C11(ISO / IEC 9899:201x)§3.4.3

     

1个未定义的行为

     

行为,在使用非便携或错误的程序结构或错误数据时,本国际标准不对其施加任何要求

     

2注意可能的未定义行为包括完全忽略具有不可预测结果的情况,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文档方式行事,终止翻译或执行(发出诊断信息)。

     

3示例未定义行为的示例是整数溢出的行为。

在C11§J.2未定义的行为

中还有未定义行为的列表

答案 1 :(得分:1)

使用非便携或错误的程序构造时,对于本国际标准没有要求的错误数据或不确定值的对象的行为。

示例:

i = ++i;

有关详情,请阅读this

答案 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(),你将得到一致的结果;因此,编译器不保证结果 - >这称为未定义的行为。