字符串复制函数strdup和_strdup
字符串复制函数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相关推荐
- 不使用库函数实现字符串复制函数strCopy
不使用库函数实现字符串复制函数strCopy算法如下: #include <stdio.h> #include <stdlib.h>char* strCopy(const ch ...
- 字符串拷贝函数strdup()
char *strdup(const char *s); 注: strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现. 字符串拷贝函数strdup()内部实现如下: ...
- C语言字符串复制函数strcpy()的编写与详解
strcpy,即string copy(字符串复制)的缩写. 原型声明:char *strcpy(char *dest, const char *src); 头文件:#include <stri ...
- C++字符串复制函数
今天用到字符串的复制操作,做一个以二进制的形式读一个文件,以16进制写到TXT中,再以十六进制转换成二进制写回原文件.达到复制文件的效果,同时用的是多线程,边读边写的操作. 期间做一个缓冲区用到了字符 ...
- C语言自定义字符串复制函数
用C语简单实现一个字符串复制函数 /*============================================================================Name ...
- 不调用C++/C字符串库函数,实现字符串复制函数strcpy
已知strcpy的函数原型:char *strcpy(char *strDest,const char *strSrc),其中strDest是目的字符串,strSrc是源字符串.不调用C++/C的字符 ...
- 字符串复制函数strcpy的实现算法
1,字符串复制,需要考虑三种情况: 目的字符串未被赋值,本身是个空串,源字符串存在. 目的字符串长度m大于或等于源字符串长度n,此时复制时,源字符串代替目的字符串前n个字符,目的字符串后m-n个字符扔 ...
- Linux字符串处理函数strdup、strndup、strndupa、strdupa
一.函数族strdup.strndup.strndupa.strdupa strdup函数原型: strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干. ...
- 字符串复制函数strncpy()和内存拷贝函数memcpy()
#include<string.h> char *strncpy(char *dest, const char *src, unsigned long n); 功能是将指针变量src所指向 ...
最新文章
- Git 2.9增加了Merge、Rebase、Commit等新特性
- spring面试重点
- 2017 ZSTU寒假排位赛 #8
- 深入理解分布式技术 - BASE 理论
- oracle定时服务器,服务器oracle数据库定时备份
- 【AC Saber】数据结构
- 角色权限模块设计-数据pdm
- Dapr项目应用探索
- mysql innodb_sort_buffer_size_mysql优化---第7篇:参数 innodb_buffer_pool_instances设置
- 翁同龢后人向上海博物馆捐赠两件重要家藏
- java 同步 set_Java Collections synchronizedSet()用法及代码示例
- minidump详细介绍
- 移卡旗下全新餐饮SaaS产品米粒餐收银发布 科技驱动零售餐饮业态场景创新
- 北邮 形式语言与自动机
- 【语音处理】开始学习语音,从基本概念和应用讲起
- php 斗牛 牌型 和 比牌 规则
- 2022秋招笔试备考合集——银行篇(下)|智测优聘出品
- 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
- php 实现二叉树的最大深度_PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)...
- 超全总结 | 阿里电商故障治理和故障演练实践