memcpy出错,长度不正确

时间:2012-10-30 15:11:13

标签: c++ c linux

我正在将Gateway中的数据(包含字符串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吗?

5 个答案:

答案 0 :(得分:6)

您复制字符串内容,但不复制终止空字符。添加一个到len,你应该没事。但正确的解决方案是使用strcpy(),它会自动复制trailling 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 );

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您需要复制len + 1个字节

目前您忘记复制空终止符\0

当您尝试访问副本时,字符串函数搜索,直到他们找到\0可能在任何地方。

答案 3 :(得分:1)

你的strlen不应该使用GatewayApplicationRlsDate的长度吗?

即:

len =(int_16)strlen(GatewayApplicationRlsDate);

答案 4 :(得分:0)

您应该使用strcpy,这也将复制尾随的空字节。

strcpy( dest_data, GatewayApplicationRlsDate );

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