本文主要介绍C语言中的strdup()函数以及strcpy()函数和strcpy函数的区别。同样用来复制字符串的两个函数的异同点值得注意,有需要的朋友可以参考一下。
头文件:
#包含字符串. h
定义功能:
char * strdup(const char * s);
函数描述:strdup()会先用maolloc()配置与参数s字符串相同的空间大小,然后将参数s字符串的内容复制到内存地址,再返回地址。地址终于可以用free()释放了。
返回值:返回一个字符串指针,指向复制的新字符串地址。如果返回NULL,则内存不足。
模型
#包含字符串. h
main(){
char a[]=' strdup ';
char * b;
b=strdup(a);
printf('b[]='%s'\n ',b);
}
执行结果:
b[]='strdup '
strdup()函数和strcpy()函数的区别
Strdup不是标准的C函数,所以linux会报错!~
Strcpy是一个标准的C函数。在windows中,报告错误是因为指针没有申请空间!~
可以先用strlen判断from的大小,然后给to申请空间,然后strcpy就不会报错了!~
Strdup可以直接把要复制的内容复制到未初始化的指针,因为它会自动给目的指针分配空间,使用就结束了。
手动释放系统自动分配的空间。
strcpy的目标指针必须是已分配内存的指针。
最近看了别人写的C语言源代码,很多人都喜欢用strdup复制字符串。我觉得这个习惯不好,因为如果你想让你的程序更有移植性,
这个功能就算了吧。我否认它的主要原因是:
1)使用strdup函数时,我们经常会忘记释放内存。可能的原因是我们对C库函数了解不够。毕竟其他模块分配内存,我们自己的模块释放内存。
2)在不同的平台上,我们可能会对strdup内存分配函数采用不同的方法,比如有些C库中的malloc分配,有些C库中的new分配(因为c++库可能会重写相关的C库代码)。所以用户发布的时候有很大的困惑。他们是使用free还是delete[]来释放分配的内存?如果我们的主管假设,使用free来释放它,操作是未知的。它可能正常工作,可能是部分内存泄漏,也可能是程序崩溃。自己程序的正确性取决于编译器,很不爽!
我认为,在模块中,除非万不得已,自己分配的内存需要其他模块释放,否则就应该自己生产,自己销售。尽量避免模块间的这种耦合,减少内存泄漏的因素。
那么读者可能会问,如果经常使用字符串复制,类似于下面的代码。
char * dest=malloc(strlen(src)1);
断言(dest!=NULL);
strcpy( dest,src);
要经常使用,写3行代码是相当冗长的,所以你也可以使用宏来修复它。这样的好处是内存是由malloc分配的,所以移植性好很多不是吗?另外,自己定义的宏会在内存分配后释放,让你念念不忘。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。