void**与int**是否为兼容类型?GCC严格别名警告疑问
关于void**与任意类型指针数组的严格别名规则疑问
我原本认为void**和MyType**(比如int**)属于不兼容类型,因此下面代码中将ptrs强制转换为void**并解引用的行,应该会触发严格别名规则违反的警告。我特意把代码中的int替换为自定义类型MyType,以此说明该问题适用于任意类型。
#include <stdlib.h> typedef int MyType; const MyType mytype_0 = 0; int main() { MyType **ptrs = malloc(10 * sizeof(MyType *)); for (size_t i=0; i<10; i++) { ptrs[i] = malloc(sizeof(MyType)); *ptrs[i] = mytype_0; } void *void_ptr = ((void **)ptrs)[3]; /* 违反严格别名规则? */ MyType *ptr = (MyType *)void_ptr; MyType val = *ptr; }
实际测试发现:当编译时设置-Wstrict-aliasing=1,确实会触发“dereferencing type-punned pointer might break strict-aliasing rules”警告,但将警告级别调整为2或3时,该警告就消失了。根据GCC文档的说明:
更高的级别对应更高的准确性(更少的误报)
这让我开始怀疑自己之前对严格别名规则的理解是否存在错误。
内容的提问来源于stack exchange,提问作者Reinier Torenbeek
相关产品推荐
相关产品推荐

