使用我的编译器(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上。为什么呢?
答案 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
中,s
是const char *
。执行char* t = s+1;
后,您从const
“删除”s
状态。因此,“丢弃限定词”。如果这是C ++,您将收到编译器错误而不是警告。
答案 2 :(得分:3)
fun1
您要将const char *
转换为char *
的原因。这正在失去const
限定符并打开门来修改函数可能不打算修改的数据。
要解决此问题,请将fun1
正文更改为
const char* t = s+1;