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
吗?
答案 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};
不会编译。