提问人:glades 提问时间:10/13/2022 最后编辑:glades 更新时间:10/14/2022 访问量:326
将 const char* 复制到uint8_t数组
Copy const char* to uint8_t array
问:
我的 C-API 将uint8_t数组作为配置参数。我带着一个 const char* 到达它的家门口。我现在如何以最没有问题的方式将字符复制到 uint8_t 数组?这是我所拥有的(人为的ofc):
#include <cstdint>
#include <cstring>
#include <cstdio>
struct config
{
uint8_t ssid_[32];
};
auto set_ssid(const char* ssid) {
// I know this fn has no sideeffects but assume for demonstration
// purposes that cfg is only initialized here
config cfg;
std::strncpy(static_cast<char*>(&cfg.ssid_), ssid, 32);
}
int main()
{
set_ssid("ComeOver");
}
但这不起作用,因为没有一个指针是 void* 类型:
<source>:14:18: error: invalid 'static_cast' from type 'uint8_t (*)[32]' {aka 'unsigned char (*)[32]'} to type 'char*'
14 | std::strncpy(static_cast<char*>(&cfg.ssid_), ssid, 32);
|
来这里安全吗?reinterpret_cast
答:
0赞
relent95
10/14/2022
#1
您应该将 用于目标缓冲区,而不是 。
此外,您应该使用 代替 ,因为 和 () 不是指针可互换的。(这是完善各种演员表的规则。请参阅static_cast转换。cfg.ssid_
&cfg.ssid_
reinterpret_cast
static_cast
char *
unsigned char *
uint8_t *
所以这是推荐的。
std::strncpy(reinterpret_cast<char*>(cfg.ssid_), ssid, 32);
// Or simply
std::strncpy((char *)(cfg.ssid_), ssid, 32);
评论
0赞
relent95
10/14/2022
我的意思是,在指向 POD 的指针之间的可能转换中,有指针可互换的情况,而不是指针可互换的情况。
0赞
user17732522
10/14/2022
是的,但无论如何,所有这些转换都会通过。 指针之间也只是一个 s 到 .这里的对象不是指针可互换的,这是真的,但为了使它起作用,指针是否可以为对象设置别名(它可能)是很重要的。void*
reinterpret_cast
static_cast
void*
评论
std::strncpy
是 C API,您应该使用一些惯用的 C++ (?)。请注意,您的函数没有任何可观察到的效果,因此不清楚您要实现什么。我也不喜欢这个 API 的设计,使用它看起来像是 UB 的缩进。std::copy
set_ssid
set_ssid