传递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
相关产品推荐
相关产品推荐

