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

传递const结构体指针及其非const成员指针是否符合C99标准?

关于C99标准下这段代码的合法性与未定义行为分析

首先看这段C代码:

typedef struct
{
    int a;
    int b;
} my_struct_t;

void f2(const my_struct_t *my_struct, int *b)
{
    *b = my_struct->a + 1;
}

void f1(my_struct_t *my_struct)
{
    f2(my_struct, &(my_struct->b));
}

问题核心

f2()中的my_struct参数被声明为const,从字面看似乎结构体成员不可修改,但f2通过第二个参数b指向该结构体的b成员并完成了修改。现在要明确:依据C99标准,这种调用f2()的方式是否合法,会不会导致未定义行为?

结论与分析

这种调用方式是合法的,不会触发未定义行为,原因如下:

  • const my_struct_t *my_struct的作用是限制通过这个指针本身去修改结构体的成员,它并没有把结构体对象本身变成不可修改的常量。
  • 在f1()中,传入f2的my_struct是一个非const的结构体指针,意味着这个结构体对象本身是允许被修改的。
  • f2的第二个参数int *b指向的是该结构体的b成员,这个指针没有const限定,而且它指向的对象(结构体的b成员)本身并不是const属性的,所以对*b赋值完全符合C99标准的规定,不存在未定义行为。

内容的提问来源于stack exchange,提问作者Parminder Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:54:50