2014-07-18 50 views
3

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

unsigned char* getBeginning(const unsigned char * Packet) 
{ 
        return Packet+3; 
} 

我研究这对SO等地,而且似乎编译器抱怨,虽然我参加一个const指针,我返回非const指针。

我试图做到的是:

1)我希望让用户知道,我不会改变自己的任何数据的这一功能,因此常量。

2)但是,后来的函数将使用返回的指针进行更改,所以我不想让我的返回类型为const。

有没有更好的方法来做到这一点,我没有得到警告?我仍然在学习C.

+1

是否确实需要删除'const'?这听起来像个坏主意...... – sircodesalot

+1

@sircodesalot:这是这种情况下常见的C语言习惯(替代方法是编写两个函数(一个用于'const',一个用于非'const'),或者写入两个函数只有一个非'const'版本,并让调用者将'const'扔掉)。 'strchr'。 – mafso

+0

谢谢你的回答!在阅读完回复后,我可能会完全错误。我打算让用户通过一个unsigned char *。它不一定是一个const unsigned char *。我想我可以在函数定义中使用“const”来表明我不会修改指向IN THIS PARTICULAR函数的数据。所以,换句话说,我并不期望用户向我传递一个const unsigned char *,我只是想向他们展示我不会在这里触及unsigned char *。稍后,返回的指针会修改数据。有一个更好的方法吗? – user1762250

回答

9

C没有从const限定的指针类型到非const限定的指针类型的隐式转换,因此您应该添加一个明确的指针,即一个强制转换。然后,警告将消失:

unsigned char* getBeginning(const unsigned char * Packet) 
{ 
        return (unsigned char *)Packet+3; 
} 

只是要小心,这个函数是那么温和的“危险”,因为它可以隐藏常量资格的下降。但它不会比标准库中的strchr这样的东西更危险。只要您避免尝试通过返回的指针修改一个const限定的对象,该行为就完全定义好了。

+0

如果我理解你,修改'strchr'的返回结果是未定义的行为,对吧? –

+1

不是_really_,它取决于传递给它的指针,如果_it_是一个'const char',那么修改它就会有风险......只是不要期望传递一个字符串常量给它返回一个指向可修改的char数组(不会发生malloc + memcpy),但是如果你传递一个常规的'char *',那么这些内存位置保持不变,如果它指向一个'char [99]''字节 – technosaurus

+0

@technosaurus,很好的解释,谢谢 –

1

Packet被宣布为const unsigned char *。添加3时,如果没有显式转换,则隐式声明结果为相同类型。

要解决你必须明确地把返回类型的错误:

return (unsigned char *) Packet + 3; 
相关问题