改变字节

一旦对象具有有效类型,你不应尝试通过其他类型的指针修改它,除非该其他类型是字符类型 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,并且没有陷阱表示。