【问题标题】:C: Illegal conversion between pointer types: pointer to const unsigned char -> pointer to unsigned charC:指针类型之间的非法转换:指向 const unsigned char 的指针 -> 指向 unsigned char 的指针
【发布时间】:2023-03-08 14:04:01
【问题描述】:

以下代码产生警告:

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 进行编译)

谢谢

【问题讨论】:

  • char * 可以转换为const char *,反之则不行。所以只需将send_str 更改为const char *
  • 谢谢!为什么它可以转换为一种方式而不能转换另一种方式?
  • 考虑一下const 的含义:一个“只读”变量。将可写变量视为只读是完全可以的,反之则不然。
  • @Jodes:因为mystr 指向(又名:它包含的地址)只读 内存,其中包含\r\nHello。该内存无法更改,因此指针是const 指针。如果你将它传递给一个接受非常量char * 的函数,则应该允许该函数更改char *arg 指向的字符串。 const char * 不允许这样做。 rw char *,传递给一个函数,因为参数是 const char * “誓言”不改变字符串,当然不是问题
  • const char *var = "string"dont-touch char *varchar *some_strtouch-or-not char *some_strconst指针可以被读写

标签: c pointers type-conversion warnings constants


【解决方案1】:

您需要添加一个演员表,因为您将常量数据传递给一个说“我可能会改变这个”的函数:

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 */

【讨论】:

  • 如果可以的话,最好重写 send_str 函数以使用const
  • @Lundin 同意,我在那里编辑了const,我误读了问题的要求。并删除了main() 评论,谢谢。
【解决方案2】:

更改以下几行

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多