为什么在初始化过程中会丢弃`const`限定符?

为什么在初始化过程中会丢弃`const`限定符?,c,constants,C,Constants,我在行中得到初始化丢弃指针目标类型中的'const'限定符警告。grid\u col=&c\u ax\u gd即为指针分配地址表达式,指针是常量结构的一部分。 我在C99标准中发现了以下内容 初始值设定项中的常量表达式允许更大的自由度。此类常量表达式应为或计算为以下之一: 一个算术常数表达式 一个空指针常量 地址常量,或 对象类型的地址常量加上或减去整数常量表达式 地址常量是空指针、指向指定静态存储持续时间对象的左值的指针或指向函数指示符的指针;应使用一元&运算符或转换为指针类型的整数常量

我在
行中得到
初始化丢弃指针目标类型中的'const'限定符
警告。grid\u col=&c\u ax\u gd
即为指针分配地址表达式,指针是常量结构的一部分。

我在C99标准中发现了以下内容

初始值设定项中的常量表达式允许更大的自由度。此类常量表达式应为或计算为以下之一:

  • 一个算术常数表达式
  • 一个空指针常量
  • 地址常量,或
  • 对象类型的地址常量加上或减去整数常量表达式
地址常量是空指针、指向指定静态存储持续时间对象的左值的指针或指向函数指示符的指针;应使用一元&运算符或转换为指针类型的整数常量显式创建,或使用数组或函数类型的表达式隐式创建


我的问题是,这是否意味着
&c_ax\u gd
是地址常量?如果是这样,在初始值设定项中为常量结构使用地址常量如何丢弃
const
限定符?

g
const
,这意味着它的所有成员都是
const
(包括
grid\u col
)。因此,
grid\u col
是指向
struct color
const
指针,
&c\u ax\u gd
是指向
const struct color
的指针

您正在尝试使用
struct color
指针初始化
const struct color
指针,这就是您收到警告的原因

C99 6.5.16.1

两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有右侧指向的类型的所有限定符


如果忽略该警告,如果将值
grid\u col
修改为,则只会得到未定义的行为。

问题出在其他地方。即使
结构
常量
,如果它有指针作为成员,这些指针指向的对象也不会自动成为
常量
。您可以从下面的示例中看到这一点

struct example {
  int * p;
};

int
main()
{
  /* const */ int a = 1;
  const struct example s = {&a};
  *(s.p) = 2;
  return 0;
}

因此,如果您取消注释
/*const*/
并将
a
的地址分配给
s.p
,您将丢弃
a
上的
const
限定符。这就是编译器警告您的问题。

不会将结构声明为
const
使其成员
const
?@Samik是的,其所有成员都是const。问题是,如果其中一些成员是指针,它们只是常量指针(您不能更改指针;它们指向的值没有限制)。你可以检查一下:谢谢,完全错过了那个,我真傻。对您的答案投了赞成票。警告是标准的一部分(特别是,发出诊断;该代码违反了约束)
struct example {
  int * p;
};

int
main()
{
  /* const */ int a = 1;
  const struct example s = {&a};
  *(s.p) = 2;
  return 0;
}