是否可以取消引用被视为地址的整数文字的可移植/有效C?即,如果我想在内存地址0x12345678
到123
设置64位值,则以下是可移植且有效的C,至少按C89标准:
*(uint64_t *)(0x12345678) = 123ULL;
我看不到编译器警告(通过gcc -std=c89 -Wall input.c
测试),但我记得在某个时候看到有关该主题的问题,其中一个案例用于将地址存储在中间变量中而不是直接取消引用整数文字(已被强制转换为指针地址)。
答案 0 :(得分:3)
只要地址0x12345678
有效并且有uint64_t
个对象,就可以使用强制转换或直接使用整数来解决问题。但它可能不是所有平台上的有效地址。所以,如果你知道你在处理什么,那很好。
固定宽度类型仅在C99中引入。所以,当你在C89询问关于转换为uint64_t*
的可移植性时,我发现它是自相矛盾的:)