带指针的 const 结构体,在没有警告的情况下丢弃限定符

psc*_*ulz 2 c gcc warnings

我有一个带有指向某物的指针的结构。我期望通过指向 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*?我一直以为但现在我很困惑。在这种情况下有可能收到警告吗?

Eri*_*hil 5

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类型的成员。一般来说,没有好的方法将这样的结构转换为另一种类型。