Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是C语言中未定义的行为?_C_Undefined Behavior - Fatal编程技术网

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

什么是C语言中未定义的行为?,c,undefined-behavior,C,Undefined Behavior,什么是C语言中未定义的行为 我正在使用GCC编译器。在某些情况下,我得到了正确的值,尽管程序的输出应该是未定义的。这些程序我运行了好几次。但结果是一致的。对于其他一些程序,结果是未定义的。那么,在哪些情况下,我应该认为程序行为真的是未定义的?有任何规则吗?使用不可移植或错误的程序结构、错误的数据或价值不确定的对象时的行为,本国际标准对此不作要求 例如: i = ++i; 有关更多信息,您可以阅读。使用不可移植或错误的程序结构、错误的数据或价值不确定的对象时的行为,本国际标准对此没有任何要求 例

什么是C语言中未定义的行为


我正在使用GCC编译器。在某些情况下,我得到了正确的值,尽管程序的输出应该是未定义的。这些程序我运行了好几次。但结果是一致的。对于其他一些程序,结果是未定义的。那么,在哪些情况下,我应该认为程序行为真的是未定义的?有任何规则吗?

使用不可移植或错误的程序结构、错误的数据或价值不确定的对象时的行为,本国际标准对此不作要求

例如:

i = ++i;

有关更多信息,您可以阅读。

使用不可移植或错误的程序结构、错误的数据或价值不确定的对象时的行为,本国际标准对此没有任何要求

例如:

i = ++i;

您可以阅读更多信息。

未定义的行为意味着编译器可以发出它喜欢的任何代码。你的程序可能会显示你期望的结果,或者格式化你的硬盘,或者开始向塔利班发送电子邮件。任何事情都可能发生

未定义的行为意味着编译器可以发出它喜欢的任何代码。你的程序可能会显示你期望的结果,或者格式化你的硬盘,或者开始向塔利班发送电子邮件。任何事情都可能发生

未定义行为的定义:

C11ISO/IEC 9899:201x§3.4.3 1未定义的行为

使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作要求

2注:可能的未定义行为范围从完全忽略情况到结果不可预测,到在翻译或程序执行过程中以环境特有的记录方式(无论是否发出诊断消息)进行行为,通过发出诊断消息来终止转换或执行

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


C11§J.2未定义行为中还有未定义行为的列表未定义行为的定义:

C11ISO/IEC 9899:201x§3.4.3 1未定义的行为

使用不可移植或错误的程序结构或错误的数据时的行为,本国际标准对此不作要求

2注:可能的未定义行为范围从完全忽略情况到结果不可预测,到在翻译或程序执行过程中以环境特有的记录方式(无论是否发出诊断消息)进行行为,通过发出诊断消息来终止转换或执行

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


C11§J.2 undefined behavior(未定义行为)中还有一个未定义行为列表。我认为,简单地说,如果指令的行为不能保证在所有编译器或所有情况下都是一致的,那么可以将其称为未定义行为。

我认为,简单地说,如果没有保证指令的行为在所有编译器或所有情况下都是一致的,可以将其称为未定义的行为。

这可以通过一个示例来说明

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

这可以通过一个例子来说明

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

问题被标记为C,在C中,i++=++i;是UB的一个糟糕的例子,因为它不是未定义的行为,它是一个语法错误。谢谢@pascalcuoq,问题被标记为C,在C中,i++=++i;是UB的一个糟糕的例子,因为它不是未定义的行为,它是一个语法错误。谢谢@PascalCuoqNo,您描述的可以是未指定的行为或实现定义的行为。不,您描述的可以是未指定的行为或实现定义的行为。太好了!!!这真是一个很好的例子…非常有用…谢谢你!!!这真是一个很好的例子…非常有用…谢谢