在C中将const赋值给非const

Ali*_*aba 3 c const void-pointers

在下面的:

struct adt { void * A; };

int new_adt(const void * const A)
{
    struct adt * r = malloc(sizeof(struct adt));
    r->A = A;
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

警告:赋值从指针目标类型中丢弃限定符


我知道我可以使用

memcpy(&(r->A), &A, sizeof(void *));
Run Code Online (Sandbox Code Playgroud)

解决它,但我必须问:有什么选择吗?

通过使用const void * const我假装说不会对输入进行任何更改.而且,现在我想到它,const void *就足够了,不是吗?(因为我无法更改指针以便它影响调用者)

感谢您抽出宝贵时间阅读.

joh*_*hne 7

通过使用const void*const,我假装没有对输入进行任何更改.

没有 假装说输入不会进行任何更改,您已明确告诉编译器您已保证不会对输入进行任何更改.

不能做你正在做的事情.


Joh*_*mew 5

如果你从来没有要修改A通过从它的指针adt,那么你应该做的是指针常量为好,即:

struct adt {
    const void * A;
};
Run Code Online (Sandbox Code Playgroud)

这将使错误消失.

如果你希望修改Aadt,那么new_adt应该采取非const指针.


编辑:更一般的说明,这可能会有所帮助:

const关键字,一般适用于类型立即到其左侧.但是,如果左侧没有类型,则它将应用于右侧的类型.所以: const int * Aint const * A(const适用于int,而不是指针)相同,但是int * const A,const适用于指针,而不适用于int.

维基百科有一个更全面的解释:const-correctness.该页面的"指针和引用"部分包含一个示例,其中包含可应用于指针的const和非const的各种组合.