c++关于calloc、memcpy、strncpy的陷阱
来源:互联网 发布:淘宝猎狐者户外冲锋衣 编辑:程序博客网 时间:2024/05/01 18:53
先来看两行代码。
char *s = ( char * )calloc( sizeof( char ), lstrlen( lpctstrBuffer ) );//分配一个与lpctstrBuffer同样长度的空间memcpy( s, lpctstrBuffer, lstrlen( lpctstrBuffer ) ); //然后把lpctstrBuffer的内容复制到s中去
你觉得这有什么不妥吗?
或者把第二行改为:
strncpy( s, lpctstrBuffer, lstrlen( lpctstrBuffer ) );
这样呢?
是的,这样干确实导致溢出了。
我们来假设,看下面代码
const char * p = "abc";char *s = ( char * )calloc( sizeof( char ), lstrlen( p ) );memcpy( s, p, lstrlen( p ) );//或者这样:strncpy( s, p , lstrlen( p ) );
上面代码执行后s的存储空间会是以下结果:
而s的长度为3;
s[0] = 'a';
s[1] = 'b';
s[2] = 'c';
注意:s没有0结尾。对s进行操作会导致溢出。
如果这时再用lstrlen等函数统计s的长度,得到的是个未知数。(不是3)。
综上所述,如果你自认对某个函数不是绝对了解我建议在你真正的项目中不要使用它。会给你带来意外惊喜哦。
来复习一下strncpy吧。另外推荐使用strncpy_s函数。
百度百科对的strncpy解释:
原型:char * strncpy(char *dest, char *src,size_tnum);
功能:(c/c++)复制src中的内容(字符,数字、汉字....)到dest,复制多少由num的值决定,返回指向dest的指针。如果遇到null字符('\0'),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。下面举例说明[1]:
char des[] = "Hello,i am!";
char source[] = "abc\0def";
strncpy(des,source,5);
此时,des区域是这样的:a,b,c,\0,\0,逗号,i,空格,a,m,!
注意:\0,\0并不是添加在!的后面。
头文件:#include "string.h"
说明:
如果n > dest串长度,dest栈空间溢出产生崩溃异常。
否则:
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n<src串长度,src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。
如果n = src串长度,与strcpy一致。
如果n >src串长度,src串存放于desk字串的[0,src串长度],dest串的(src串长度, dest串长度]处存放NULL。
2)src串长度>dest串长度
如果n =dest串长度,则dest串没有0结尾符。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况的问题。当然喽,无论是strcpy还是strncpy,保证src串长度<dest串长度才是最重要的。
- c++关于calloc、memcpy、strncpy的陷阱
- C 函数 strncpy && memcpy
- C语言字符串相关库函数的实现strcpy、memcpy、strncpy、strcat、strncpy、memset、memcpy、strcpy
- 浅谈C的一些拷贝函数:strcpy, strncpy, memcpy
- C语言基础-strdup/strcpy/strncpy/memcpy函数的使用
- memcpy 与 strncpy的区别
- strncpy和memcpy的异同
- strncpy,strcpy,memcpy的区别
- memcpy,strcpy,strncpy的用法
- strcpy、strncpy、memcpy的区别
- strcpy、strncpy、memcpy的区别
- C库函数之strcpy,strncpy,memcpy
- C之memset、memcpy、strcpy、strncpy区别
- 经典的memcpy、strncpy的实现代码
- memcpy与strcpy(strncpy)的惨痛经历
- 有关strncpy,memcpy,memmove的比较
- strcpy,strncpy,memcpy的源码分析
- strcpy、strncpy和memcpy的区别
- log4net使用详解(1)
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- bug之谈
- 图:比赛打分展示双屏管理软件系统的V2.0版本终于收工.
- Log4Net使用详解(2)
- c++关于calloc、memcpy、strncpy的陷阱
- 母函数练习2 HDU 1085
- Winform Log4Net实战:实现每天一个文件记录服务程序的执行情况。
- 感知计算:开发人员的十大资源
- rss TIOBE Programming Community Index for June 2013
- cocos2d-x的初步学习十七之坦克大战四
- 维斯(Vizrt)系统学习资源列表(持续更新)
- Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- 配置FCKeditor_2.6.3+fckeditor-java-2.4