gpt4 book ai didi

带指针的 const 结构,丢弃的限定符没有警告

转载 作者:行者123 更新时间:2023-12-02 15:46:00 25 4
gpt4 key购买 nike

我有一个带有指向某物的指针的结构。我期望通过指向结构的指向常量结构的指针访问此指针会给我一个指向常量的指针。但是 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
}

那么 SC->ptr 实际上是一个 const void* 吗?我一直假设,但现在我很困惑。在这种情况下是否有可能得到警告?

最佳答案

SC->ptrvoid * const .它不是 const void *const void * const .

const struct S* SC = S;定义 SC成为指向 struct S 的指针那是 const -合格的。事实上结构是const -qualified 意味着你不应该修改结构。该结构包含一个成员 ptr类型 void * .因为结构是const -合格,其成员是const -合格的。这意味着你不应该改变 ptr .它的类型是 void * const .

但是,这并不影响ptr指着。不管是否ptr本身就是const -合格,它指向void ,而不是const void .

C 标准没有提供处理结构的多个版本的好方法,其中一个版本的成员指向非 const。类型,另一个有指向 const 的成员类型。一般来说,没有好的方法可以将一种这样的结构转换为另一种类型。

关于带指针的 const 结构,丢弃的限定符没有警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74157993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com