C:编译器警告"返回丢弃指针目标类型的限定符"

use*_*250 5 c pointers const

我从下面的函数中得到一个编译器"警告:从指针目标类型返回丢弃限定符".

unsigned char* getBeginning(const unsigned char * Packet)
{
                    return Packet+3;
}
Run Code Online (Sandbox Code Playgroud)

我已经在SO和其他地方研究了这个,看起来编译器抱怨说虽然我接受了一个const指针,但我返回一个非const指针.

我想要完成的是:

1)我想让用户知道我不会在这个函数中改变他们的任何数据,因此const.

2)但是,以后的函数会使用这里返回的指针进行更改,所以我也不想让我的返回类型为const.

在我没有得到警告的情况下,有更好的方法吗?我还在学习C.

R..*_*R.. 11

C没有从const限定的指针类型到非const限定的类型的隐式转换,所以你应该添加一个显式的,即一个强制转换.然后警告就会消失:

unsigned char* getBeginning(const unsigned char * Packet)
{
                    return (unsigned char *)Packet+3;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此功能稍微有点"危险",因为它可以隐藏const限定的丢弃.但它并不比strchr标准库中的类似事情更危险.只要您不通过返回的指针尝试修改const限定对象,就可以很好地定义该行为.

  • 不_really_,它取决于传递给它的指针,如果_it_是一个`const char`,那么修改它将有风险......只是不要指望传递一个字符串文字常量给它返回一个新的指向一个可修改的指针char的数组(没有malloc + memcpy发生),但如果你传递一个常规的`char*`,那些内存位置保持不变,如果它指向`char [99]`那么修改那些99字节是安全的 (2认同)