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