C:指针类型之间的非法转换:指向const unsigned char的指针 - >指向unsigned char的指针

时间:2014-02-20 09:33:36

标签: c pointers type-conversion warnings const

以下代码产生警告:

const char * mystr = "\r\nHello";
void send_str(char * str);

void main(void){
    send_str(mystr);
}
void send_str(char * str){
    // send it
}

错误是:

Warning [359] C:\main.c; 5.15 illegal conversion between pointer types
pointer to const unsigned char -> pointer to unsigned char

如何在没有警告的情况下将代码更改为编译? send_str()函数还需要能够接受非常量字符串。

(我正在使用Hi-Tech-C编译器编译PIC16F77)

由于

2 个答案:

答案 0 :(得分:5)

你需要添加一个强制转换,因为你将常量数据传递给一个“我可能会改变它”的函数:

send_str((char *) mystr);  /* cast away the const */

当然,如果函数确实决定改变实际上应该是常量的数据(例如字符串文字),那么你将得到未定义的行为。

但是,也许我误解了你。如果send_str()永远不需要更改其输入,但可能会调用调用者的上下文中非常量的数据,那么您应该只创建参数const只是说“我不会改变这个”:

void send_str(const char *str);

使用常量和非常量数据都可以安全地调用它:

char modifiable[32] = "hello";
const char *constant = "world";

send_str(modifiable);  /* no warning */
send_str(constant);    /* no warning */

答案 1 :(得分:5)

更改以下行

void send_str(char * str){
// send it
}

TO

void send_str(const char * str){
// send it
}

你的编译器说你的发送被转换为char指针的const char指针。在函数send_str中更改其值可能会导致未定义的行为。(大多数调用和调用函数的情况不会由同一个人编写,其他人可能会使用您的代码并调用它来查看原型而不是对。)