字符串复制函数strdup和_strdup

函数原型

#include <string.h>
char *strdup(const char *s); 

strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现。

strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。该函数的返回值是返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

记得要用free()释放内存!!!

函数实现:

char * __strdup(const char *s)
{size_t  len = strlen(s) +1;void *new = malloc(len);if (new == NULL)return NULL;return (char *)memecpy(new,s,len);
}

应用:

#include<bits/stdc++.h>
using namespace std;
int main()
{char* str="bdhf";char* des;des=_strdup(str);cout<<des<<endl;free(des);return 0;
}

char*可以string不可以用

但是char[]数组和char*可以

#include<bits/stdc++.h>
using namespace std;
int main()
{char str[4]={'b','d','f','d'};char*des;//string依旧不可以des=_strdup(str);cout<<des<<endl;free(des);return 0;
}

strdup和_strdup的区别:

strdup是POSIX: _strdup是Windows特定: 在Unix上,使用的strdup。

在windows上两者均可;

使用malloc动态分配内存:

以double为例

double *x=(double *)malloc(sizeof(double));//对于非字符串用sizeof
double *x=(double *)malloc(10*sizeof(double));
double *x=(double *)malloc(8);//也可直接写数字,但是不建议
//对于字符串不建议使用sizeof
char* s="hdifn";
char* des=(char *)malloc(strlen(s)+1);//用strlen确定字符串长度并加1来为字符串结束符留出空间
strcpy(des,s);//将s的内容复制到des

直接使用malloc来复制字符串容易忘记分配地址空间,可以编译通过但可能会中途失败

例如:

char* s="hdifn";
char* des;//没有给des分配内存,那么只是在栈空间的一个字符指针的大小,而不能容纳s的内容
strcpy(des,s);

直接由int等定义的变量的位置在栈空间中,而通过malloc、new等由动态分配的内存是存在于可以有程序员支配的堆空间中,char* des=(char *)malloc(strlen(s)+1)中des存在于栈空间,存的是动态分配的处于堆空间中的地址。

其他:

在不同的平台上,我们对于strdup内存分配的函数可能采用不同的方法,比如在某些c库中用malloc来分配,而在某些c++库中,用new来分配 (因为c++库可能重写了相关的c库代码)。所以对使用者在释放它的时候产生了很大的疑惑,是用free还是用delete[]来释放所分配的内存呢?! 如果我们主管臆断,用free来释放它,操作未知。可能工作正常,可能是部分内存泄漏,也可能是程序崩溃。

字符串复制函数strdup和_strdup相关推荐

  1. 不使用库函数实现字符串复制函数strCopy

    不使用库函数实现字符串复制函数strCopy算法如下: #include <stdio.h> #include <stdlib.h>char* strCopy(const ch ...

  2. 字符串拷贝函数strdup()

    char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...

  3. C语言字符串复制函数strcpy()的编写与详解

    strcpy,即string copy(字符串复制)的缩写. 原型声明:char *strcpy(char *dest, const char *src); 头文件:#include <stri ...

  4. C++字符串复制函数

    今天用到字符串的复制操作,做一个以二进制的形式读一个文件,以16进制写到TXT中,再以十六进制转换成二进制写回原文件.达到复制文件的效果,同时用的是多线程,边读边写的操作. 期间做一个缓冲区用到了字符 ...

  5. C语言自定义字符串复制函数

    用C语简单实现一个字符串复制函数 /*============================================================================Name ...

  6. 不调用C++/C字符串库函数,实现字符串复制函数strcpy

    已知strcpy的函数原型:char *strcpy(char *strDest,const char *strSrc),其中strDest是目的字符串,strSrc是源字符串.不调用C++/C的字符 ...

  7. 字符串复制函数strcpy的实现算法

    1,字符串复制,需要考虑三种情况: 目的字符串未被赋值,本身是个空串,源字符串存在. 目的字符串长度m大于或等于源字符串长度n,此时复制时,源字符串代替目的字符串前n个字符,目的字符串后m-n个字符扔 ...

  8. Linux字符串处理函数strdup、strndup、strndupa、strdupa

    一.函数族strdup.strndup.strndupa.strdupa strdup函数原型: strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干. ...

  9. 字符串复制函数strncpy()和内存拷贝函数memcpy()

    #include<string.h> char *strncpy(char *dest, const char *src, unsigned long n); 功能是将指针变量src所指向 ...

最新文章

  1. Git 2.9增加了Merge、Rebase、Commit等新特性
  2. spring面试重点
  3. 2017 ZSTU寒假排位赛 #8
  4. 深入理解分布式技术 - BASE 理论
  5. oracle定时服务器,服务器oracle数据库定时备份
  6. 【AC Saber】数据结构
  7. 角色权限模块设计-数据pdm
  8. Dapr项目应用探索
  9. mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
  10. 翁同龢后人向上海博物馆捐赠两件重要家藏
  11. java 同步 set_Java Collections synchronizedSet()用法及代码示例
  12. minidump详细介绍
  13. 移卡旗下全新餐饮SaaS产品米粒餐收银发布 科技驱动零售餐饮业态场景创新
  14. 北邮 形式语言与自动机
  15. 【语音处理】开始学习语音,从基本概念和应用讲起
  16. php 斗牛 牌型 和 比牌 规则
  17. 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
  18. 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
  19. php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...
  20. 超全总结 | 阿里电商故障治理和故障演练实践

热门文章

  1. containsKey
  2. KubeVirt — 安装KubeVirt及启动VM
  3. HDFS Federation方案落地
  4. Hadoop Federation联邦机制
  5. android 如何获取离开屏幕时间,android – SurfaceHolder回调如何与Activity生命周期相关?...
  6. ArcMap 根据已有的线要素生成剖面图
  7. Google Earth 去除标签的方法
  8. Google earth engine——导入表数据
  9. 身份证号脱敏处理,各页面的身份证号隐藏11-16位
  10. Foreman-porxy负载均衡搭建