我有一个带有指向某物的指针的结构。我期望通过指向 const 结构的指针访问该指针会给我一个指向 const 的指针。但在这种情况下 gcc 不会产生警告:
#include <stdlib.h>
struct S {
void* ptr;
};
struct S* create(void)
{
struct S* S = malloc(sizeof(*S));
S->ptr = malloc(sizeof(int));
return S;
}
void some_func(void* p);
int main(void)
{
struct S* S = create();
const void* ptr = S->ptr;
const struct S* SC = S;
some_func(ptr); // warning as expected
some_func(SC->ptr); // no warning
}
Run Code Online (Sandbox Code Playgroud)
那么实际上是SC->ptr一个const void*?我一直以为但现在我很困惑。在这种情况下有可能收到警告吗?
SC->ptr是一个void * const. 它不是一个const void *或const void * const。
const struct S* SC = S;定义SC为指向 - 限定的 a 的struct S指针const。事实上,结构是const- 限定的,这意味着您不应该修改该结构。ptr该结构包含类型为 的成员void *。因为该结构是const- 限定的,所以它的成员也是const- 限定的。这意味着你不应该改变ptr。它的类型是void * const.
但是,这并不影响ptr指向的内容。不管ptr它本身是否有const-资格,它都指向void,而不是指向const void。
C 标准没有提供处理结构的多个版本的良好方法,其中一个版本具有指向非类型的成员const,另一个版本具有指向const类型的成员。一般来说,没有好的方法将这样的结构转换为另一种类型。