You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:13:12