dpair[0].dpairid, id0, 8); 这里的id0是-6ren">
gpt4 book ai didi

c++ - 尝试从常量 char * 类型的指针复制数据时出现 "accessing beyond memory"错误。为什么?

转载 作者:行者123 更新时间:2023-11-30 02:47:27 25 4
gpt4 key购买 nike

以下语句抛出访问超出内存错误。我仍然不确定为什么会那样做。谁能帮我我在这里做错了什么?谢谢

    memcpy(mhp_ptr->dpair[0].dpairid, id0, 8);

这里的id0const char *

类型

其中,mhp_ptr 是 mhp_t * 类型,定义如下:-

typedef struct mhp_s 
{
uint8_t editor[16];
uint64_t refcode;
uint64_t error_id;
union
{
uint8_t dpairtbl[16][6];
dpairtbl_t dpair[6];
};
} mhp_t;

dpairtbl_t 定义如下:-

typedef struct dpairtbl_s
{
char dpairid[8];
uint64_t dpairdata;
} dpairtbl_t;

错误:- 访问超出分配的内存 'memcpy' 可以从缓冲区 'id0' 中读取 8 个字节

我的项目的编译器设置将警告视为错误。正常编译工作正常,但它会发出警告,根据我的编译器中的设置,该警告被视为错误。 只是想知道为什么它对 strcpy 工作正常,但在 memcpy 的情况下发出警告。在字符串的情况下,是否对 memcpy 的使用有任何 C++ 限制

最佳答案

memcpy 视为内存中字节的原样复制:

memcpy(mhp_ptr->dpair[0].dpairid, id0, 8);

如果id0的长度小于8,memcpy也会复制不属于你的内存,如果是8个或更多字符很长,dpairid 将不会正确地以 null 终止。

如果您不能保证 id0 的大小恰好是 8 个字节,您应该将其视为字符串,以便根据终止字符确定长度:

strncpy (mhp_ptr->dpair[0].dpairid, id0, 7);
mhp_ptr->dpair[0].dpairid[7] = '\0';

关于c++ - 尝试从常量 char * 类型的指针复制数据时出现 "accessing beyond memory"错误。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22759474/

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