关于使用memcpy复制的陷阱

事故代码如下:

 475     /* fill certificate subject. */ 
 476     subj = (char *)malloc((strlen(conf.cert_subj) + 1) * sizeof(char));                                                    
 477     if (subj == NULL) {  
 478         printf("%s[%d]: malloc failed!\n", __FUNCTION__, __LINE__);                                        
 479         return ERROR;
 480     }
  482    memset(subj, 0, strlen((conf.cert_subj)) * sizeof(char));                                                              
 483 
 484     memcpy(subj, conf.cert_subj, strlen((conf.cert_subj)) * sizeof(char));                                                 
 485 
 486     //subj[strlen(conf.cert_subj)] = '\0';                                                                                   
 487 
 488     printf("conf.cert_subj= [%d]: %s\n", (int)strlen(conf.cert_subj), conf.cert_subj);
 489     printf("subj= [%d]: %s\n", (int)strlen(subj), subj);   

输出异常:

conf.cert_subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD
subj= [58]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCDª˛

解决办法:

 486     subj[strlen(conf.cert_subj)] = '\0'; 

输出正常:

conf.cert_subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD
subj= [54]: /C=CN/ST=Liaoning/L=Shenyang/O=abcdefg/OU=ABCD/CN=ABCD

总结:

在申请内存空间时,可以多出一个字节,如:
subj = (char *)malloc((strlen(conf.cert_subj) + 1) * sizeof(char));

在使用memcpy时,即便是使用strlen控制复制的长度,也会出现多复制内存的情况,因此在复制结束后一定要显示的在最后显示添加'\0'。
如:subj[strlen(conf.cert_subj)] = '\0';

在使用strncpy情况会好点!
发布了207 篇原创文章 · 获赞 77 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/daa20/article/details/78913193
今日推荐