为什么编译器会抱怨分配?

时间:2015-02-27 16:04:18

标签: c variable-assignment

编译以下代码时,编译器会生成警告:

从指针目标类型

分配丢弃'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);
}

2 个答案:

答案 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)的指针,并将其指定给允许修改其数据的指针。坏和危险。

在第二种情况下,您将使用非常量指针并将其指定给指针,该指针可能导致较少的故障。你不是要对任何有害,非法或不明确的行为开放。