在C中更改只读结构成员

v8wbuo2f  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(111)

有人能解释一下为什么这不起作用吗?我正在尝试更改一个只读结构体成员。(问题仅用于知识目的)

typedef struct {
    int a;
    int b;
}A;
const A B={
    .a = 5,
    .b = 1,
};
int main()
{
    int *ptr = &B.a;
    *ptr = 12;
  
    printf("var = %d\n", B.a);
    return 0;
}

但这能行吗

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

int main()
{
    const A B={
        .a = 5,
        .b = 1,
    };
    int *ptr = &B.a;
    *ptr = 12;
  
    printf("var = %d\n", B.a);
    return 0;
}
dzhpxtsq

dzhpxtsq1#

两个“都不起作用”,两个版本都是无效的C。C中的初始化是“根据赋值规则”。C17 6.5.16中的相关语言约束为:

  • 左操作数具有原子、限定或非限定指针类型,并且(考虑左操作数在左值转换之后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左操作数所指向的类型具有右操作数所指向的类型的所有限定符;
    简单地英语,=的左操作数是ptr。它是一个非限定指针类型,意味着它缺少const。左边的类型没有&B.aconst int*)所指向的类型得到的const限定符。上面的引号不成立。
    因此,这两个程序都是无效的C,并且生成二进制可执行文件的编译器无论如何都依赖于未定义的行为:任何事情都有可能发生,而C语言并没有具体说明。

相关问题