编译以下代码时,编译器会生成警告:
从指针目标类型
分配丢弃'const'限定符#include<stdio.h>
int main(void)
{
char * cp;
const char *ccp;
cp = ccp;
}
这段代码还可以(没有警告)。为什么?
#include<stdio.h>
int main(void)
{
char * cp;
const char *ccp;
ccp = cp;
}
编辑:那为什么这不行?
int foo(const char **p)
{
// blah blah blah ...
}
int main(int argc, char **argv)
{
foo(argv);
}
答案 0 :(得分:5)
因为添加常量是一个安全的&#34;操作(你限制你可以对指向的对象做什么,这没什么大不了的),而删除const则不是(你承诺不通过指针触摸指向的对象,现在你试图收回你的承诺)
至于附加问题,它在C-Faq中解释:http://c-faq.com/ansi/constmismatch.html。简单地说,允许这种转换将允许另一种&#34;不安全的&#34;行为:
int give_me_a_string(const char **p)
{
const char *str="asd";
*p=str; // p is a pointer to a const pointer, thus writing
// a in *p is allowed
}
int main()
{
char *p;
give_me_a_string(&ptrs); //< not actually allowed in C
p[5]='a'; // wooops - I'm allowed to edit str, which I promised
// not to touch
}
答案 1 :(得分:2)
在第一种情况下,您将获取指向不得修改的数据(const
)的指针,并将其指定给允许修改其数据的指针。坏和危险。
在第二种情况下,您将使用非常量指针并将其指定给指针,该指针可能导致较少的故障。你不是要对任何有害,非法或不明确的行为开放。