我正在将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
吗?
答案 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::string
或std::vector<char>
。