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个字节给终止符:
createpass = xcalloc(len + 1, sizeof(char)); - 完成两次
memcpy后,手动添加字符串终止符:memcpy(createpass + userpasslen, salt, saltlen); createpass[len] = '\0'; // 新增这一行
这样修改后,strlen和printf就能正确识别字符串的结束位置,不会再出现垃圾字符了。
内容的提问来源于stack exchange,提问作者Avinash Ghadshi
相关产品推荐
相关产品推荐

