gpt4 book ai didi

c - c中uint8_t的字符串赋值

转载 作者:行者123 更新时间:2023-11-30 18:36:45 26 4
gpt4 key购买 nike

我试图将字符串分配给 IAR 中的 uint8_t 缓冲区,但收到一条警告消息。

rx_buffer.rx_struct.RESP.RESPONDuint8_t 类型的 struct field

我的代码是:

strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,', 3);

相关的警告消息如下:

Warning[Pe1422]: multicharacter character literal (potential portability problem) 
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char *",
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char const"

我写了一个解决方法:

rx_buffer.rx_struct.RESP.RESPOND[0] = 'N';
rx_buffer.rx_struct.RESP.RESPOND[1] = 'S';
rx_buffer.rx_struct.RESP.RESPOND[2] = ',';

但我对此并不满意。正确的做法是什么?

最佳答案

您的代码在很多方面都不正确:

strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,',3);
  • 目标数组的类型不是 char *
  • 源不是一个数组:'NS,' 是一个多字符字符常量,一个不可移植的历史怪异,没有人会在任何像样的代码中使用...将其转换为 ( uint8_t *) 无法解决此问题。您应该只使用双引号:"NS,".
  • strncpy() 不是适合这项工作的工具。事实上,它从来都不是适合任何工作的工具。这个函数不是strcpy的安全替代品,它的语义被广泛误解,它很容易出错。您应该避免使用此功能。在这种特殊情况下,它只会按预期复制 3 个字节,但当 memcpy() 是更简单的解决方案时,为什么要使用 strncpy() 呢?

您可以通过以下方式实现您的目标:

memcpy(rx_buffer.rx_struct.RESP.RESPOND, "NS,", 3);

或者按照问题中发布的方式单独分配每个字节。两种方法都可能产生相同的机器代码。

关于c - c中uint8_t的字符串赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com