改變位元組
一旦物件具有有效型別,你不應嘗試通過其他型別的指標修改它,除非該其他型別是字元型別 char
,signed char
或 unsigned char
。
#include <inttypes.h>
#include <stdio.h>
int main(void) {
uint32_t a = 57;
// conversion from incompatible types needs a cast !
unsigned char* ap = (unsigned char*)&a;
for (size_t i = 0; i < sizeof a; ++i) {
/* set each byte of a to 42 */
ap[i] = 42;
}
printf("a now has value %" PRIu32 "\n", a);
}
這是一個列印的有效程式
a 現在有價值 707406378
這是因為:
- 訪問型別為
unsigned char
的各個位元組,因此每個修改都已明確定義。 - 物件的兩個檢視,通過
a
和*ap
,別名,但由於ap
是指向字元型別的指標,因此嚴格別名規則不適用。因此,編譯器必須假設a
的值可能已在for
迴圈中更改。a
的修改值必須由已更改的位元組構成。 a
,uint32_t
的型別沒有填充位。表示的所有位都計入值,這裡是707406378
,並且沒有陷阱表示。