3

我正在尝试将 32 字节字符串的前 16 个字节复制到dest.

unsigned char src[32] = "HELLO-HELLO-HELLO-HELLO-HELLO-12";
unsigned char dest[16];

memcpy(dest, src, 16); // COPY

printf("%s\n", src);
printf("%lu\n", strlen(src));

printf("%s\n", dest);
printf("%lu\n", strlen(dest));

输出如下

HELLO-HELLO-HELLO-HELLO-HELLO-12
32
HELLO-HELLO-HELLHELLO-HELLO-HELLO-HELLO-HELLO-12
48

我只希望收到HELLO-HELLO-HELLdest的前 16 个字节dest实际上包含预期的结果。

为什么dest比它实际可以容纳的更多?为什么它有一个长度16+32=48?有没有办法只复制 to 的前 16 个src字节dest

4

2 回答 2

7

为 dest 分配的 16 个字节需要包含一个用于尾随 NULL ('\0') 的字节——因为你写了 16 个字节,所以你有一个非空终止的字符串。

由于您所在的计算机以特定方式组织了堆栈,因此您将继续通过 dest 的末尾,然后打印 src。

因此,要复制 16 个字节,分配 17 个字节为尾随的 null 留出空间,然后对其进行初始化。

unsigned char dest[17]={0};

或者,在复制它之后,null 终止它:

memcpy(dest, src, 16); // COPY
dest[16]='\0';
于 2014-12-10T21:01:53.283 回答
3

您没有考虑字符串以空结尾的事实。在 "HELLO..." 字符串常量的末尾有一个 '\0' 字符。看一眼

http://www.tutorialspoint.com/c_standard_library/c_function_strncpy.htm

那应该为您指明正确的方向。memcpy 不为 C 字符串提供帮助 - 只是原始内存。

于 2014-12-10T21:02:11.703 回答