memcpy错误,长度不正确

Error on memcpy, length not correct

本文关键字:不正确 错误 memcpy      更新时间:2023-10-16

我正在将网关中的数据(包含字符串Oct/10/12)复制到dest_data,但dest_data获得的字符比来源多:

unsigned_8   *dest_data
int_16 len;      
len = (int_16)strlen( Gateway ); // len got 9 correctly
(void)memcpy( dest_data, GatewayApplicationRlsDate, len );

dest_data的最终输出是"Oct/10/1210.1.3"

复制之前我必须清洁dest_data吗?

复制字符串内容,但不复制终止的null字符。给len加一,你就没事了。但正确的解决方案是使用strcpy(),它会自动复制tralling null字符。

另外,考虑为dest_data(malloc((len + 1) * sizeof(*dest_data));)分配内存

unsigned_8   *dest_data;
int_16 len;      
len = (int_16)strlen( Gateway ) + 1; 
dest_data = malloc(len * sizeof(*dest_data));
(void)strcpy( dest_data, GatewayApplicationRlsDate );

没有为dest_data分配内存(它是一个未初始化的指针),并且memcpy()没有复制空终止符。为dest_data分配len + 1字节的内存,并复制len + 1以复制空终止符。

您需要复制len+1字节的

此时您忘记了复制空终止符

当您尝试访问副本时,字符串函数会进行搜索,直到找到一个可能在任何地方的

您的strlen不应该使用GatewayApplicationRsDate的长度吗?

即:

len=(int_16)strlen(GatewayApplicationRsDate);

您应该使用strcpy,这也会复制后面的空字节。

strcpy( dest_data, GatewayApplicationRlsDate );

当然,所有关于处理原始指针的注意事项都适用。实际上,您可能应该使用std::stringstd::vector<char>