C内存重叠吗?

des*_*top 1 c string cstring memcpy memmove

我正在尝试将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));
Run Code Online (Sandbox Code Playgroud)

输出如下

HELLO-HELLO-HELLO-HELLO-HELLO-12
32
HELLO-HELLO-HELLHELLO-HELLO-HELLO-HELLO-HELLO-12
48
Run Code Online (Sandbox Code Playgroud)

我期待收到HELLO-HELLO-HELLdest唯一。的前16个字节dest实际上包含预期的结果。

为什么dest超出其实际承受能力?为什么长度为16+32=48?有没有办法只复制前16个字节的srcdest

Joh*_*hnH 5

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

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

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

unsigned char dest[17]={0};
Run Code Online (Sandbox Code Playgroud)

或者,将其复制后,将其终止为null:

memcpy(dest, src, 16); // COPY
dest[16]='\0';
Run Code Online (Sandbox Code Playgroud)