在C中正确地将const void指针强制转换为const char指针数组

pos*_*ist 6 c gcc pointers casting char

我有一段看起来像这样的C代码:

const char (*foo)[2] = bar();
Run Code Online (Sandbox Code Playgroud)

现在bar()是一个返回a的函数(const void *).我如何正确地投射这个const指针?该代码从GCC产生此警告:

"initialization discards qualifiers from pointer target type".   
Run Code Online (Sandbox Code Playgroud)

以下是我不成功的一些尝试:

const char (*foo)[2] = (const char *)bar();
const char (*foo)[2] = (const void **)bar();
Run Code Online (Sandbox Code Playgroud)

原始代码确实有效,我只是无法通过正确转换返回值来消除警告.

编辑:有人建议:

const char (*foo)[2] = (const char (*)[2])bar();
Run Code Online (Sandbox Code Playgroud)

它似乎是正确的,但GCC给出了这个警告:

"cast discards qualifiers from pointer target type"   
Run Code Online (Sandbox Code Playgroud)

这几乎与原始警告相同.

编辑2:好的,我想我已经知道了.这里真正的问题是( const void * )定义bar().的const在定义(const char( * )[2])指的是阵列的元件,而不是指向数组.这种类型定义本质上是一个数组,当由void指针表示时不是 const.真正的答案是,在施放时( const void * )失去了它cons的力量(const char ( * )[2]).

Jed*_*Jed 6

其他几个人已经说出了正确的演员,但它会产生虚假的警告.该警告来自C标准中可能存在的错误,或者(取决于您的解释)GCC应特别处理的案例.我相信const限定符可以安全无误地提升到数组类型.您可以放弃该警告-Wno-cast-qual但当然会消除您实际关心的案例的警告.

详细说明,类型const char (*)[2]意味着"指向数组的指针(长度为2)const char".数组未标记const,只是数组的元素.与类型相比const void *,编译器注意到后者是指针const,而前者不是,因此生成警告.const即使const数组等于数组,C标准也无法将数组标记为const.