• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中的strdup()函数和其与strcpy()函数的区别

C语言中的strdup()函数和其与strcpy()函数的区别

作者:chumojing 字体:[增加 减小] 来源:互联网 时间:2017-05-28

chumojing 通过本文主要向大家介绍了c语言strdup,c语言中strcpy,c语言中strcpy函数,c语言strcpy,c语言实现strcpy等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

头文件:

#include <string.h>
</div>

定义函数:

char * strdup(const char *s);
</div>

函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。

返回值:返回一字符串指针,该指针指向复制后的新字符串地址。若返回NULL 表示内存不足。

范例

#include <string.h>
main(){
  char a[] = "strdup";
  char *b;
  b = strdup(a);
  printf("b[]=\"%s\"\n", b);
}

</div>

执行结果:

b[]="strdup"
</div>

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 );
assert( dest != NULL );
strcpy( dest, src );
</div>

经常要被使用,写3行代码比较罗嗦,那么不妨使用宏来搞定它吧。这样做的好处是确定了内存是用malloc分配的,移植性好多了,难道不是吗?!此外,自己定义的宏,分配内存后要释放,总不会忘记吧

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中的strdup()函数和其与strcpy()函数的区别

相关文章

  • 2017-05-28浅谈C++虚重载操作符 virtual operator= 的使用方法
  • 2017-05-28C++你最好不要做的几点小结
  • 2017-05-28关于STL中的map容器的一些总结
  • 2017-05-28C#中委托的基本用法总结
  • 2017-05-28详解C++中const_cast与reinterpret_cast运算符的用法
  • 2017-05-28C语言中结构体struct编写的一些要点解析
  • 2017-05-28C++中不能被重载的运算符介绍
  • 2017-05-28C/C++ 公有继承、保护继承和私有继承的对比详解
  • 2017-05-28VC实现A进程窗口嵌入到B进程窗口中显示的方法
  • 2022-04-30C语言字符串指针(指向字符串的指针)详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++加密解密php代码的方法
    • C/C++中如何判断某一文件或目录是否存在
    • vector与map的erase()函数详细解析
    • VC中Tab control控件的用法详细解析
    • 使用钩子如何锁定键盘的方法分享
    • 如何在C语言的宏中使用类型关键字
    • 使用ShellClass获取文件属性详细信息的实现方法
    • C++ 自定义控件的移植问题
    • sizeof()的简单介绍
    • 文件编译时出现multiple definition of 'xxxxxx'的具体解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有