const char *指针算术警告

时间:2011-05-23 18:40:34

标签: c pointers

使用我的编译器(Apple llvm-gg-4.2)这段代码:

void fun1(const char *s)
{
    char* t = s+1;
}
void fun2(char *s)
{
    char* t = s+1;
}

int main(void)
{
    char* a;
    fun1(a);
    fun2(a);
}

发出此警告:

junk.c:3:警告:初始化会丢弃指针目标类型的限定符

在fun1上但不在fun2上。为什么呢?

3 个答案:

答案 0 :(得分:4)

fun1正在使用const char *并被分配给char *
而fun2正在使用char *并被分配给char *,这很好。

If you are assigning a constant pointer to a non-const pointer, this means you can modify the const pointer by using the const pointer

在这种情况下,如果你执行t[0] = 'a'内部的fun1是不合法的,因为你正在修改const内存,这就是编译器警告你的原因

答案 1 :(得分:3)

fun1中,sconst char *。执行char* t = s+1;后,您从const“删除”s状态。因此,“丢弃限定词”。如果这是C ++,您将收到编译器错误而不是警告。

答案 2 :(得分:3)

fun1您要将const char *转换为char *的原因。这正在失去const限定符并打开门来修改函数可能不打算修改的数据。

要解决此问题,请将fun1正文更改为

const char* t = s+1;