用动态分配内存制作一个字符串的一份拷贝。注意:调用程序应该负责检查这块内存是否分配成功,这样做允许程序以任何它所希望的方式对错误作出反应。

#nclude <stdlib.h>
#include <string.h>
char * strdup( char const *string )
{char *new_string;//请求足够长度的内存,用于存储字符串和它的结尾NUL字节new_string = malloc( strlen( string ) + 1 );//如果我们得到内存,就复制字符串if( new_string != NULL )strcpy( new_string, string );return new_string;
}

输入被读入缓冲区,每次读取一行。此时可以确定字符串的长度,然后就分配内存用于存储字符串。最后,字符串被复制到新内存。这样缓冲区又可以用于读取下一个输入行。

上面的程序返回一个输入字符串的拷贝该拷贝存储于一块动态分配的内存中。函数首先试图获得足够的内存来存储这个拷贝。内存的容量比字符串的长度多一个字节,以便存储字符串结尾的NUL字节。如果内存分配成功,字符串就被复制到这块新内存。最后,函数就返回一个指向这块内存的指针。注意,如果由于某些原因导致内存分配失败,new_string的值将为NULL。在这种情况下,函数将返回一个NULL指针。

什么时候内存会分配失败呢?

对于malloc动态内存分配函数来说,如果内存池是空的,或者它的可用内存无法满足你的要求时,会发生什么情况呢?

在这种情况下,malloc函数向操作系统请求,要求得到更多的内存,并在这块内存上执行分配任务。如果操作系统无法向malloc函数提供更多的内存,malloc就返回一个NULL指针。因此,对每个从malloc返回的指针都应该进行检查,确保它并非NULL是非常重要的。

最后,对上述函数做出一个总结,该函数就是对输入的字符串检查它的长度,然后动态分配内存,内存的大小是字符串长度多一个字节,用于存储字符串结尾的NUL字节,之后,判断动态内存分配是否成功,如果成功,则执行复制字符串操作,对函数接收的字符串复制到一块新的内存中去。函数返回一个指向该内存的指针。如果内存分配失败,则函数返回一个NULL指针。

【 C 】动态内存分配实用案例(二)之复制字符串相关推荐

  1. 【 C 】动态内存分配实用案例(一)之读取、排序和打印一列整形值

    什么时候用动态内存分配呢?下面这个案例给出了一个比较实用且精彩地使用动态内存的场合,并且教你如何合理地使用动态内存分配? 动态内存分配一个常见的用途就是为那些长度在运行时才知的数组分配内存空间. 下面 ...

  2. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  3. 【C语言】------ 动态内存分配

    动态内存开辟详解 动态内存分配 什么是动态内存分配? 一.为什么使用动态内存分配呢? 二.动态内存函数 1.malloc和free 2.calloc和realloc 三.常见的动态内存错误 1.对`N ...

  4. 【 C 】动态内存分配案例分析

    声明一个指向char类型的指针,可以在声明的时候就对其进行初始化,这样是合理的. 例如: E1: #include <stdio.h> #include <stdlib.h> ...

  5. 使用malloc动态内存分配一个二维数组

    由于一部分编译器(比如说vs 2019)不支持创建数组时元素个数为变量,今天使用malloc来实现此功能. 详细注释和代码如下 //动态内存分配 模拟二维数组 #include<stdio.h& ...

  6. 【c++内存系列】二、c++动态内存分配和静态内存分配

    一.内存的静态分配与动态分配方式 先简单理解静态分配与动态分配: 静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态 ...

  7. 二维数组及其二维数组的动态内存分配

    本文为大一时所写的文章(2017/4/9),文笔还很生疏,在很多问题上认识不深,算是在学校的微信公众号上的一个编程探究模块上的投稿,本人当时也参与了本模块的维护和管理.补档. 今天我们来聊聊二维数组及 ...

  8. 二维数组及其动态内存分配

    一.二维数组的基本概念 1.1 二维数组的内存映像 从内存角度看,二维数组和一维数组一样,在内存中都是连续分布的多个内存单元,并没有本质差别,只是内存的管理方式不一样,如下图所示 一维数组int a[ ...

  9. Unix/Linux操作系统分析实验二 内存分配与回收:Linux系统下利用链表实现动态内存分配

    Unix/Linux操作系统分析实验一 进程控制与进程互斥 Unix/Linux操作系统分析实验三 文件操作算法: 实现在/proc目录下添加文件 Unix/Linux操作系统分析实验四 设备驱动: ...

最新文章

  1. 女生学编程有哪些好处呢?
  2. c语言哪个编译软件能够将整个工程自动生成调用图_这10个C语言技巧让初学者少走180天弯路!...
  3. 如何对SAP Leonardo上的机器学习模型进行重新训练
  4. 雅克德罗机器人_什么腕表配饰值得买 带货明星们都已经帮你选好了
  5. 出现问题Debug Assertion Failed!
  6. 20155307 《Java程序设计》课堂实践项目数据库
  7. C程序设计语言现代方法02:C语言基本概念
  8. 1.nodejs介绍
  9. GO语言学习之路13
  10. 省级面板数据(2000-2019)三:人口比、抚养比、就业、失业、离婚、教育(stata版)
  11. RTI公司任命Elektrobit前首席执行官Alexander Kocher为其顾问委员会成员
  12. iP138版 离线iP数据库ip.txt导入Mysql示例
  13. 掌握4点职场技巧,打破测试人中年危机
  14. 扒开思派健康招股书:大数据的面子,“卖药”的里子
  15. Flutter三天学会之后模仿美团界面
  16. vc中操作INI文件函数
  17. svn服务端删除版本库_删除SVN目录及从服务器端删除SVN版本库文件方法详解
  18. matlab画磁滞回线,[画图的问题]怎么画类似于磁滞回线的图像?一个x值对应两个y值的...
  19. 安装Visual Studio .NET 2003 时提示 FrontPage 2000 Web 客户端扩展失败
  20. 选修课:唐宋词鉴赏课堂笔记04

热门文章

  1. VS2008中的“解决方案配置”和“解决方案平台”不见了(Release和Debug)的解决方法...
  2. C语言4行7列星星,如何使用C++循环语句实现星号塔5行每行分别是1,3,5,7,9个星星?...
  3. php中rsort,php数组函数排序之rsort()
  4. linux回显冲突,Linux-Binfmt-support-不允许我回显注册
  5. python下载保存_下载并保存图片Python2.7
  6. 手摇计算机教程视频,使用手摇计算机的照片
  7. js两个等号和三个等号_js中两个等号(==)和三个等号(===)的区别
  8. 如何验证php7安装成功_linux安装php7的方法详解
  9. php 4443 端口_Server configuration (Notary)
  10. 欢聚时代java面试_欢聚时代面试经验