将 const char* 复制到uint8_t数组

Copy const char* to uint8_t array

提问人:glades 提问时间:10/13/2022 最后编辑:glades 更新时间:10/14/2022 访问量:326

问:

我的 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

C++ C-strings 重新解释-强制转换 static-cast uint8t

评论

0赞 Marek R 10/13/2022
std::strncpy是 C API,您应该使用一些惯用的 C++ (?)。请注意,您的函数没有任何可观察到的效果,因此不清楚您要实现什么。我也不喜欢这个 API 的设计,使用它看起来像是 UB 的缩进。std::copyset_ssid
0赞 Marek R 10/13/2022
可能的方法:godbolt.org/z/78WxaWqG8 如您所见,编译器认为没有副作用并删除了其代码。因此,请提供执行有意义的操作的代码。set_ssid
0赞 Captain Giraffe 10/13/2022
查看 stackoverflow.com/questions/10151834/...
0赞 glades 10/13/2022
@MarekR 谢谢你,我没有想到copy_n。我知道该功能没有副作用,但我放大了有问题的问题以进行演示,并将所有行李排除在外。
0赞 user17732522 10/14/2022
@MarekR 读取越界。

答:

0赞 relent95 10/14/2022 #1

您应该将 用于目标缓冲区,而不是 。 此外,您应该使用 代替 ,因为 和 () 不是指针可互换的。(这是完善各种演员表的规则。请参阅static_cast转换cfg.ssid_&cfg.ssid_reinterpret_caststatic_castchar *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_caststatic_castvoid*