c++的未定义行为

C++ undefined behavior

本文关键字:未定义 c++      更新时间:2023-10-16
unsigned char * numbers = {1,1,1};
unsigned short * ptr = (unsigned short*) numbers;
*(++ptr)=2;
printf("%d %d %d %d", numbers[0], numbers[1], numbers[2], numbers[3]);

以上可能导致未定义的行为,对吗?另外,屏幕上将打印什么?

结果是1 1 2 0,但1 1 0 2是否可以打印?

将导致未定义的行为。首先,因为你让一个char指针指向一个整数数组:注意unsigned char * numbers = {1,1,1};unsigned char numbers[] = {1,1,1}; unsigned char* ptr = numbers;之间的区别。

还因为程序打破了严格的混叠规则。任何事情都可能发生:程序可能输出某种结果,或者垃圾,或者崩溃。

此外,强制转换为unsigned short假设有特定的CPU端序。因此,如果你的程序碰巧去了未定义的行为"打印某种结果",该结果将取决于CPU端序。

以上可能导致未定义的行为,对吗?

(1)不仅行为可以是未定义的,而且它始终是未定义的。

还有,屏幕上会打印什么?

根据(1)

未定义

是否在某些计算机上打印"1 1 0 2"

。也可能不会。因为任何结果都是可能的。参见(1).

我们不知道最后一个字符是什么,但是前3个字符将被打印出来。

它们可能不能打印。参见(1).

这段特殊的代码:

unsigned char * numbers = {1,1,1};

不编译