C ++未定义的行为

时间:2015-08-31 14:36:15

标签: c++

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吗?

2 个答案:

答案 0 :(得分:3)

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

但也因为程序打破了strict aliasing rule。任何事情都可能发生:程序可能会打印某种结果,或者垃圾,或者崩溃。

此外,您对无符号短语的强制转换假设具有某种CPU字节顺序。因此,如果您的程序碰巧遇到未定义的行为“打印某种结果”,那么结果将取决于CPU的结束。

答案 1 :(得分:3)

  

上述情况可能导致未定义的行为,对吧?

(1)不仅 行为未定义, 总是未定义。

  

此外,屏幕上会打印什么?

根据(1)

未定义
  

这会在某些计算机上打印" 1 1 0 2"

可能。或者它可能不会。这是可能的,因为任何结果都是可能的。见(1)。

  

我们不确定最后一个角色会是什么,但第3个将打印好。

他们可能打印好了。见(1)。

这段特殊代码:

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

不会编译。