有人能解释一下为什么这不起作用吗?我正在尝试更改一个只读结构体成员。(问题仅用于知识目的)
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;
}
1条答案
按热度按时间dzhpxtsq1#
两个“都不起作用”,两个版本都是无效的C。C中的初始化是“根据赋值规则”。C17 6.5.16中的相关语言约束为:
简单地英语,=的左操作数是
ptr
。它是一个非限定指针类型,意味着它缺少const
。左边的类型没有&B.a
(const int*
)所指向的类型得到的const
限定符。上面的引号不成立。因此,这两个程序都是无效的C,并且生成二进制可执行文件的编译器无论如何都依赖于未定义的行为:任何事情都有可能发生,而C语言并没有具体说明。