改變位元組

一旦物件具有有效型別,你不應嘗試通過其他型別的指標修改它,除非該其他型別是字元型別 charsigned charunsigned 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 的修改值必須由已更改的位元組構成。
  • auint32_t 的型別沒有填充位。表示的所有位都計入值,這裡是 707406378,並且沒有陷阱表示。