c语言strdup,C语言中的strdup()函数和其与strcpy()函数的区别
头文件:
#include
定义函数:
char * strdup(const char *s);
函数说明:strdup()会先用maolloc()配置与参数s 字符串相同的空间大小,然后将参数s 字符串的内容复制到该内存地址,然后把该地址返回。该地址最后可以利用free()来释放。
返回值:返回一字符串指针,该指针指向复制后的新字符串地址。若返回NULL 表示内存不足。
范例
#include
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语言strdup,C语言中的strdup()函数和其与strcpy()函数的区别相关推荐
- Go语言编程—Go语言中JSON的处理(map、struct 和 JSON字符串的相互转换)
JSON的简单介绍 JSON (JavaScript Object Notation)是一种比XML更轻量级的数据交换格式,在易于人们阅读和编写的同时,也易于程序解析和生成.尽管JSON是JavaSc ...
- 【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符的作用、C语言中的 联合体
本章目录: 1. c语言中%x.%c.%d.%x等等等 2. c语言取地址符&的作用 3. 了解 C语言中的 联合体 3.1 什么是联合体? 3.2 定义 3.2.1 举例 3.3 初始化联合 ...
- const 作用 c语言,在C语言中const 作用的的全面总结.doc
右面拒账则川盾衡徊洁豁却尤骂登硫矢窍松寝春摘慌瘪悯嚏蓑篓雍淫东佳粮瘤遍榜柔脾右晕沮椒肃蛾闲惹戚谩智胜汁秀玉怠继纺侥圃唯需齿翟顿稽吩餐音欧宪撅虐镁级脖铲贵酋挚昂藕瓢需冷乃依萎听滚俄郭奴痈急欲沾挂畅好姐载 ...
- 1加3减5加7减9C语言表示,c语言中1+三分之一加五分之二加七分之三
c语言中1+三分之一加五分之二加七分之三以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中1+三分之一加五分之二加 ...
- c语言中值程序,编程c语言中,向上取整函数_C编程中的函数
编程c语言中,向上取整函数 什么是功能? (What is a Function?) A Function is a block of statements that performs a speci ...
- linux c语言 getline,C语言中getline()函数的深入理解
我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数.所以,自己在Linux下man了一把,并做了测试.g ...
- c语言 ——int16,c语言中int取值范围为16位指的是什么16位
匿名用户 1级 2013-10-20 回答 1.c语言中int取值范围为16位指的是什么16位 计算机用二进制表示数值,最小单位就是位(bit),可以储存0或1,16位就是有16个储存0或1的位,其中 ...
- C语言中,箭头符号 “->” 和点号符号 “.”的区别
在C语言中,箭头符号 "->" 用于访问结构体(struct)或联合体(union)类型的成员.它可以替代点号(.)来访问结构体或联合体的成员,当通过指针访问时使用箭头符号. ...
- go语言中channel的创建和销毁以及匿名函数的使用
channel的创建 go语言中,任意类型前面加上关键字chan即可声明对应类型的通道,创建通道需要使用make,make也用于map 和slice的创建 创建一个通道 /*刚创建的通道是nil*/ ...
最新文章
- java spring cloud版b2b2c社交电商spring cloud分布式微服务-docker-feign-hystrix(六)
- oracle+trunkc,Oracle常用备份与恢复操作
- win 修改jvm时间_Windows 下修改Tomcat jvm参数
- 在linux kernel或android中解析cmdline参数
- Android 2.3发短信详细流程
- Android自定义view之事件传递机制
- UVA10074 Take the Land【最大子段和+DP】
- 系统学习深度学习(二) --自编码器,DA算法,SDA,稀疏自编码器
- 【机房收费系统C#版】——导出Excel
- Java开发视频网站大概需要多少钱?
- 【scratch高阶案例教学】scratch斐波那契数列 scratch创意编程 少儿编程 小朋友们也可以完成如此神奇的数列
- java突击面试章程
- Simple QQLogin 2.1(QQ登陆器,适用于 QQ2009 或更新版本)
- 怎样用计算机做ppt,电脑怎么制作ppt步骤
- UG NX 工程图视图概述
- ipa java_Java 解析 IPA 文件,读取 Info.plist 信息
- 智慧城市智能化建设发展现状及展望
- php 美团配送 生成签名
- 护卫神mysql初始密码_护卫神MySQL密码重置器(MySQL密码重置工具)V1.3 最新免费版...
- 计算机散热程序,电脑的散热方法_百度经验
热门文章
- java containskey_Java中Map.containsKey的问题
- Windows操作系统开机启动项目录位置及注册表项
- matlab doc(),matlab指令大全(Matlab instruction Daquan).doc
- c语言 for循环 逗号,vs中for语句中的逗号怎么使用?
- 无法生成commit-msg文件
- python文件复制重命名_python复制文件并重命名
- 身份证隐藏显示-uniapp
- 在斜坡上哪个物体滚的最快_教科版小学三年级科学下册第一单元第4课《物体在斜面上运动》教案...
- 虚拟主机做服务器 PHP+Android客户端+MySql数据库
- 中小企业如何进行社会化媒体营销