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

 更新时间:2015年08月25日 10:37:24   作者:chumojing  
这篇文章主要介绍了C语言中的strdup()函数和其与strcpy()函数的区别,同样用于拷贝字符串的两个函数的异同值得注意,需要的朋友可以参考下

头文件:

#include <string.h>

定义函数:

char * strdup(const char *s);

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

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

范例

#include <string.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 );
assert( dest != NULL );
strcpy( dest, src );

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

相关文章

  • C++ 中回调函数详解及简单实例

    C++ 中回调函数详解及简单实例

    这篇文章主要介绍了C++ 中回调函数详解及简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • C语言实现万年历

    C语言实现万年历

    这篇文章主要为大家详细介绍了C语言实现万年历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • C语言实现计算器的两种方法

    C语言实现计算器的两种方法

    这篇文章主要为大家详细介绍了C语言实现计算器的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++中list的用法实例讲解

    C++中list的用法实例讲解

    list是顺序容器的一种,list是一个双向链表,使用list需要包含头文件list,这篇文章主要给大家介绍了关于C++中list的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • 基于VC中使用ForceInclude来强制包含stdafx.h的解决方法

    基于VC中使用ForceInclude来强制包含stdafx.h的解决方法

    本篇文章是对VC中使用ForceInclude来强制包含stdafx.h的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言基础 strlen 函数

    C语言基础 strlen 函数

    这篇文章主要介绍了C语言基础 strlen 函数,在C 语言中,char 字符串也是一种非常重要的数据类型,我们可以使用 strlen 函数获取字符串长度,这就是C语言strlen 函数的作用,下面我们来简单介绍该内容,需要的朋友可以参考以下
    2021-10-10
  • json格式解析和libjson的用法介绍(关于cjson的使用方法)

    json格式解析和libjson的用法介绍(关于cjson的使用方法)

    下面小编就为大家带来一篇json格式解析和libjson的用法介绍(关于cjson的使用方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • 教你Visual Studio 2022如何新建一个C语言工程(图文详解)

    教你Visual Studio 2022如何新建一个C语言工程(图文详解)

    这篇文章主要介绍了Visual Studio 2022如何新建一个C语言工程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • C++求最大公约数四种方法解析

    C++求最大公约数四种方法解析

    这篇文章主要为大家详细介绍了C++求最大公约数四种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • c++中的stack和dequeue解析

    c++中的stack和dequeue解析

    这篇文章主要介绍了c++中的stack和dequeue介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论