为什么编译器会抱怨赋值?
Why does the compiler complain about the 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);
}
因为添加 constness 是一个 "safe" 操作(您限制了您可以对指向的对象执行的操作,这没什么大不了的),而删除 constness 则不是(您承诺不接触指向的对象通过那个指针,现在你正试图收回你的承诺)。
关于附加问题,在C-Faq中有说明:http://c-faq.com/ansi/constmismatch.html。简单地说,允许这种转换将允许另一种 "unsafe" 行为:
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
}
在第一种情况下,您使用指向不得修改的数据的指针 (const
),并将其分配给允许修改其数据的指针。又坏又危险。
在第二种情况下,您采用非常量指针并将其分配给一个指针,该指针可能会导致 比原始指针更少的麻烦。您不会对任何有害、非法或未定义的行为敞开心扉。
编译以下代码时,编译器产生警告:
赋值从指针目标类型中丢弃‘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);
}
因为添加 constness 是一个 "safe" 操作(您限制了您可以对指向的对象执行的操作,这没什么大不了的),而删除 constness 则不是(您承诺不接触指向的对象通过那个指针,现在你正试图收回你的承诺)。
关于附加问题,在C-Faq中有说明:http://c-faq.com/ansi/constmismatch.html。简单地说,允许这种转换将允许另一种 "unsafe" 行为:
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
}
在第一种情况下,您使用指向不得修改的数据的指针 (const
),并将其分配给允许修改其数据的指针。又坏又危险。
在第二种情况下,您采用非常量指针并将其分配给一个指针,该指针可能会导致 比原始指针更少的麻烦。您不会对任何有害、非法或未定义的行为敞开心扉。