You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中memcpy后字符串末尾出现垃圾字符的排查求助

排查memcpy后目标字符串末尾出现垃圾字符的问题

我来帮你分析下这个问题——你遇到的末尾垃圾字符,核心原因是C语言字符串缺少终止符'\0',咱们一步步拆解来看:

你的代码

int threshold = passlen - type;
printf("THRESHOLD: %d\n",threshold);
printf("TYPE: %d\n",type);
printf("decodedpass: %s len(decodepass): %d\n",decodedpass,strlen(decodedpass));
strncpy(salt, &decodedpass[threshold] , type);
printf("-------SALT: %s\n",salt);
salt[type] = '\0';
printf("-------LASTSALT: %s\n",salt);
saltlen = strlen(salt);
printf("-------SALTLEN: %d\n",saltlen);
int len = saltlen + userpasslen;
printf("-------USERPASS: %s\n",userpass);
printf("-------LENSALTandUSERPASSLEN: %d\n",len);
createpass = xcalloc(len, sizeof(char));
memcpy(createpass, userpass, userpasslen);
printf("-------len(createpass):%d userpasslen:%d len(salt):%d saltlen:%d salt:%s\n",strlen(createpass),userpasslen,strlen(salt),saltlen,salt);
printf("-------CREATEPASSmemcpy1: %s\n",createpass);
memcpy(createpass + userpasslen, salt, saltlen);
printf("-------CREATEPASSmemcpy2: %s len(createpass):%d\n",createpass,strlen(createpass));

运行输出

THRESHOLD: 20
TYPE: 8
decodedpass: G�f�ɴ�=-$�o� :K���R12345678 len(decodepass): 28
-------SALT: 12345678
-------LASTSALT: 12345678
-------SALTLEN: 8
-------USERPASS: 1234567890123456
-------LENSALTandUSERPSSLEN: 24
-------len(createpass):16 userpasslen:16 len(salt):8 saltlen:8 salt:12345678
-------CREATEPASSmemcpy1: 1234567890123456
-------CREATEPASSmemcpy2: 123456789012345612345678� len(createpass):26

问题根源

你用xcalloc(len, sizeof(char))分配了24字节的内存(len=16+8=24),随后用两次memcpy把userpass的16字节和salt的8字节完全填满了这块内存。但C语言的字符串必须以'\0'作为结束标志,strlen、printf("%s")这类函数都是靠这个字符判断字符串结束位置的。

现在你的createpass内存被有效字符完全占满,没有多余空间存放'\0',所以strlen会继续往内存深处查找,直到遇到一个随机的'\0',这中间的随机字符就是你看到的垃圾内容。

解决办法

只需要两个小修改就能搞定:

  1. 分配内存时多留1个字节给终止符:
    createpass = xcalloc(len + 1, sizeof(char));
    
  2. 完成两次memcpy后,手动添加字符串终止符:
    memcpy(createpass + userpasslen, salt, saltlen);
    createpass[len] = '\0'; // 新增这一行
    

这样修改后,strlen和printf就能正确识别字符串的结束位置,不会再出现垃圾字符了。

内容的提问来源于stack exchange,提问作者Avinash Ghadshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:28:52