有memcpy问题

SPB*_*SPB 3 c

char *a=NULL;

char *s=NULL; 

a=(char *)calloc(1,(sizeof(char))); 

s=(char *)calloc(1,(sizeof(char))); 

a="DATA"; 

memcpy(s,a,(strlen(a))); 

printf("%s",s);
Run Code Online (Sandbox Code Playgroud)

你能告诉我为什么它打印DATA½½½½½½½■■■??????????????????? 谢谢

Pet*_*ham 6

C中的字符串以零字符值(nul)终止.

strlen返回零之前的字符数.

所以你不是在复制零.

printf继续运行,在s之后打印内存中的任何内容,直到它达到零.

您也只是创建一个大小为1的缓冲区,因此您在s之后的任何内容上写入数据,并且在将set设置为文字之前将内存calloc泄漏到a.

在找到字符串的长度后,为s分配内存,再分配一个字节以包含nul终止符,然后将a复制到s中.在存储文字"DATA"之后,您不需要为C运行时分配任何内容.