为什么这个uint32_t强制转换在iPhone模拟器和iPhone设备上表现不同?

Pär*_*erk 2 c iphone language-lawyer ios-simulator

为什么以下代码在iPhone模拟器和设备上的行为有所不同?我在intel macbook pro上运行模拟器,该设备是iPhone 5(型号MD297KS/A).

码:

uint8_t original = 23;
uint8_t * pointerToOriginal = &original;
uint32_t * casted = (uint32_t *)pointerToOriginal;
printf("original: %u\ncasted: %u\n", original, *casted);
Run Code Online (Sandbox Code Playgroud)

在模拟器上运行时的输出:

original: 23
casted: 23
Run Code Online (Sandbox Code Playgroud)

在设备上运行时的输出:

original: 23
casted: 2755278871
Run Code Online (Sandbox Code Playgroud)

我假设转换会导致垃圾数据包含在转换整数中,因此设备输出对我有意义,但为什么整数不受模拟器中转换中引入的额外数据的影响?

ser*_*gej 5

C11标准"6.3.2.3-7":

指向对象类型的指针可以转换为指向不同对象类型的指针.如果生成的指针未针对引用的类型正确对齐,则行为未定义....

C11标准"J.2":

在以下情况下,行为未定义:...

  • 两种指针类型之间的转换会产生错误对齐的结果(6.3.2.3).

强调我的

  • 很好地发现,这种解除引用甚至都是不必要的. (2认同)