1

我正在将 Gateway 中的数据(包含字符串Oct/10/12)复制到dest_datadest_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复印前需要清洗吗?

4

5 回答 5

6

您复制字符串内容,但不复制终止的空字符。给 len 添加一个,你应该没问题。但正确的解决方案是使用strcpy(),它会自动复制尾随的空字符。

另外,考虑为 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 );
于 2012-10-30T15:12:46.717 回答
3

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

于 2012-10-30T15:13:02.003 回答
1

您需要复制 len + 1 个字节

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

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

于 2012-10-30T15:12:46.640 回答
1

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

IE:

len = (int_16)strlen( GatewayApplicationRlsDate );

于 2012-10-30T15:21:29.560 回答
0

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

strcpy( dest_data, GatewayApplicationRlsDate );

当然,所有关于处理原始指针的警告都适用。真的,您可能应该使用std::stringor std::vector<char>

于 2012-10-30T15:15:58.153 回答