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

标签 c pointers type-conversion warnings constants

以下代码产生警告:

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

谢谢

最佳答案

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

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

关于C: 指针类型之间的非法转换:指向 const unsigned char 的指针 -> 指向 unsigned char 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903648/

相关文章:

c - 为在 void 函数中创建的动态数组赋值不会在 main() 中返回相同的值

c++ - 如何分配给 C++ 字符串空指针参数?

c# - 从 IEnumerable 到 List 的强制转换无效

c - 使用 atoi() 对整数进行输入验证

c - 以非零状态退出

c++ - 包含 malloc 声明的头文件的名称是什么?

c++ - 引用和指针有什么区别?

c - 将函数的局部变量传递回其参数

Java BigDecimal ,相当于 C# 的 Decimal(int[] bits) 构造函数

java - 将 Double 转换为 Key(优先级队列)