我知道char*可以成为任何东西的别名,但这种允许会不会反过来呢?
TLDR:个
不是的.在不违反严格别名的情况下,您不能将[un[signed]] char
数据视为任何其他类型.
然而,untyped内存是不同的.can通过赋值将无类型内存视为一种新类型.
Full Answer:个
给char *bufptr
分,投到void **
分
(void **)bufPtr
可能违反6.3.2.3 Pointers, paragraph 7:
指向对象类型的指针可以被转换为指向不同对象类型的指针.如果结果指针未正确对齐被引用的类型,则行为未定义.
请注意,不必取消引用指针即可调用未定义的行为--仅creating个未对齐的指针就足以调用未定义的行为.
使用为取消引用的指针赋值
*(void **)bufPtr = ptr1;
可能违反严格锯齿,也可能不违反严格锯齿,具体取决于bufptr
实际指向的内容.
从 comments 移动到聊天,记忆一直被描述为"未输入的".在这种情况下,这样的赋值不违反严格的别名.
然而,该存储器的使用的history可能会影响该存储器是否保持非类型化.请参见Does C strict aliasing make untyped static memory pools impossible?.请特别注意this answer点:
这样的分配器在strictly conformingC下是不能实现的,strictly conformingC是不依赖于未指定的、未定义的或实现定义的行为的C代码(并且不超过任何最小实现限制).用conformingC编写这样的分配器是完全可能的,它是带扩展的C.
如果使用GCC,我会用-fno-strict-aliasing
和-fno-ipa-strict-aliasing
编译分配器代码,如果不使用,我会用等价的代码编译.请参见https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fstrict-aliasing.