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-HELL的dest唯一。的前16个字节dest实际上包含预期的结果。
为什么dest超出其实际承受能力?为什么长度为16+32=48?有没有办法只复制前16个字节的src到dest?
分配给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)