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

C标准中结构体成员的const限定疑问:GCC与IAR编译器对const结构体指针的指针成员类型解析分歧

C标准中结构体成员的const限定疑问:GCC与IAR编译器对const结构体指针的指针成员类型解析分歧

今天在工作里碰到个挺头疼的问题,是关于结构体里const限定符的传播逻辑的。我正在给一段老代码补全const正确性,结果发现GCC和IAR两个编译器对同一段代码的处理完全不一样,这可把我搞懵了。

核心争议其实很明确:当我们给一个结构体变量加上const限定后,它内部的指针成员到底会被解析成<type>* const(只有指针本身不可修改),还是const <type>* const(指针本身和指向的内容都不可修改)?

我写了个最小复现示例:

struct S
{
    char* p;
};

void f(const struct S* s)
{
    char* non_const_char = s->p;
    *non_const_char = 'a'; // 修改的内容可以被认为是const结构体的一部分
}

这段代码在GCC下能正常编译通过,但到了IAR这里直接报错了,错误信息是:

value of type "char const *" cannot be assigned to an entity of type "char *"

我查了不少技术讨论,结论是GCC的行为才是符合C标准的——当const限定作用于结构体指针时,只会把结构体的成员本身变成const属性,对于指针成员来说,就是指针本身不可修改(相当于char* const),但指针指向的内容并不会被自动加上const限定。所以s->p的类型还是char*,而非const char*,自然可以赋值给char*类型的变量,也能修改指向的内容。

备注:内容来源于stack exchange,提问作者sljung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:04:49