在C语言学习005:不能修改的字符串中我们知道字符串是存储在常量区域的,将它赋值给数组实际是将常量区的字符串副本拷贝到栈内存中,如果将这个数组赋值给指针,我们可以改变数组中的元素,就像下面那样

 int main(){
char s[]="hello c";
char* temp=s;
temp[]='a';
temp[]='b';
printf("%s\n",s);
return ;
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAocAAAAbCAIAAACBTbKkAAACFklEQVR4nO3dW1LiQABA0SzCD40BN+BWSAiuzjzYw+gGXMM4C5qPSAsBYnBwmlDnFB8a8uhUUd7qrlgkaV6neXWXV3eL6nbxfLt4rn79vnkskiR525J8S3fg267w1sHt++/2Ng5fbn//kScfPmdv2CPPP7D/wCHfG+eYW7ic+/3y0gfPk4z+DEQZP8AZpMXRKk/CsT/BF+jCh3d2U7/fqY8fmKTPKufV3QSrnJxvTvmjJjHIM5r6/U59/MBUpUWdFnWa15swV5OrMgBcifuuysWmynlVv6gyAMQQqhwe+6rNlQEgivui7oXZXBkA4rhfNp9hzus0r1UZAOLIlk0X5jBdHq7ywIOpX/4/qMdZAWBIqHKYMdcv78Nz5eG+Djf7X4cLAFcsWzYfYV5+hFmVASCOrGw2Ye5XecyK9H5ox1f51JVtK+EAXLmsbLswh3XsZm+u3Avh9q/HWrt/oZNOMny4MANwnUKVw4y5OTRXvqgqA8B1mpVNVjZZ2YYwN6/vN4/FQDVVGQB+xBSrrNAAXKdZ2c66Rexyp8rJke+d7f2wH9pt47ePGeqp+wPAxMxWbRfmWdl2M+ZQZQDgv5qv2ln3UmUAiGu3yk1WqjIARDJftfNNlbtX8/pHlQEggs8qb9qsygAQx3y13glz2bZWsAEgilDlEObWXBkAolBlALgUD0/rh6f19jq2KgNAHL0qz1UZACL5C06XcNUkF2U9AAAAAElFTkSuQmCC" alt="" />  

  但是现在我们不想让指针可以修改字符串数组的中的元素,而又可以得到字符串中的元素,那么我么需要再拷贝一份字符串数组的元素的副本,然后把地址给到指针,就可以通过strdup实现

 int main(){
char s[]="hello c";
char* temp=strdup(s);
temp[]='a';
temp[]='b';
printf("%s\n",s);
return ;
}

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoUAAAAYCAIAAAADLBA3AAABaklEQVR4nO3cTU7CQBiA4TmTXkQPIJRr6GGg9RLiikvAWb7EmcYF/jSAtbJwIj7PikzopLs336Rtulu+3C3z07Zc3z4kAODXRUSaLfNsldd6DACVRESarfJslZ+2WY8BoIrPHpuPAaAWPQaA+iIizQc93rybvsVmYMo6AHAgItK8zfPBfHxeQb+6So8B4FvvPW71GACqGevxQUrHz5+nr//0HNu5NwAXb9/jctzjgyQPc3gyjRN7/O0+I5dLMgCXKiJS05Z5W06eVx/0eGRU/YUeA8CleutxM63HIxvpMQCc7Zwe15qPtRmASxURqen6pisn3z8+/n0cxc2R6etTbvGn/weAPyci0qLrm673fS4AqGXQ450eA0Ad+x6XRdc/73o9BoAq3uZjPQaAiiIiLR71GABq0mMAqO/zvHqtxwBQycf7x56vBoBqPp6vLutdub7RYwCoYP+9zNy0eb0tVzf3te8HAP6jiHgF7D5JpbbOH9EAAAAASUVORK5CYII=" alt="" />

  

C语言学习018:strdup复制字符串数组的更多相关文章

  1. 【C语言学习】-05 二维数组、字符串数组、多维数组

    ⼆二维数组.字符串数组.多维数组

  2. 吴裕雄--天生自然C++语言学习笔记:C++ 字符串

    C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持.字符串实际上是使用 null 字符 ...

  3. C语言学习之我见-strcpy()字符串复制函数

    strcpy()函数,用于两个字符串值的复制. (1)函数原型 char * strcpy(char * _Dest,const char * _Source); (2)头文件 string.h (3 ...

  4. C语言学习之我见-strncpy()字符串复制函数(可控制范围)

    strncpy()函数,用于两个字符串值的复制. (1)函数原型 char *strncpy(char * _Dest,const char * _Source,size_t _Count); (2) ...

  5. Go语言学习笔记(三)数组 & 切片 & map

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 数组 Arrays 数组是同一种数据类型的固定长度的序列. 数组是值类型,因此改变副本的值,不会改变本身的值: 当 ...

  6. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  7. Go语言学习之4 递归&闭包&数组切片&map&锁

    主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...

  8. Swift语言学习(四)字符串与Array等集合的使用

    Swift 提供了C和Objective-C基础类型的自己一套版本,包括用于整型的Int,用于浮点值的Double和Float,用于布尔值的Boolean,和用于文本数据的String.Swift还提 ...

  9. Dart语言学习(六) Dart 列表List数组

    创建List : var list = [1,2,3,"Dart",true]; 创建不可变List : var list = const [1,2,3,"Dart&qu ...

随机推荐

  1. Matrix Admin 后台模板笔记

    一个后台模板用久了就想换一个.上次找到了Matrix Admin.和ACE一样都是Bootstrap风格,比较容易上手.Matrix要更健壮些.感觉拿去做用户界面也是可以的. 整体风格: 1.表单验证 ...

  2. Spring-Context之三:使用XML和Groovy DSL配置Bean

    在第一讲中显示了如何使用注解配置bean,其实这是Spring3引进的特性,Spring2使用的是XML的方式来配置Bean,那时候漫天的XML文件使得Spring有着配置地狱的称号.Spring也一 ...

  3. Android Studio2.x版本无法自动关联源码的解决方法

    Android Studio2.x版本无法自动关联源码的解决方法 在学习android开发过程中,对于一个不熟悉的类,阅读源码是一个很好的学习方式,使用andorid studio开发工具的SDK M ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(九):自定义菜单接口说明

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>介绍了如何通过通用接口获取AccessToken,有了AccessToken,我们就可以来操作 ...

  5. WebApi系列~dynamic让你的省了很多临时类

    回到目录 dynamic这个动态类型早在.net3.5时就已经出现了,当时是伴随的Linq一起让我们认识的,但在使用时总觉得有点别扭,因为它是internal的,所以不能跨程序集使用,这对于分层开发的 ...

  6. OutputCache属性详解(一)一Duration、VaryByParam

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  7. BugHD for JavaScript上线,轻松收集前端 Error

    从收集 APP 崩溃信息到全面收集网站出现的 Error,现在的 BugHD 变得更加强大.目前,BugHD JS Error 收集功能 已正式上线,前端 er 们不用再面对一堆 Bug 无处下手. ...

  8. Android笔记——活动的生命周期

    一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...

  9. try-catch和throw,throws的区别

    java里的异常多种多样,这是一种非常有用的机制,它能帮助我们处理那些我们未知的错误,在java里,关于异常的有throw throws,还有一个try catch 程序块.接下来我们挨个看看这几个的 ...

  10. ssh(sturts2_spring_hibernate) 框架搭建之struts2

    一.struts2完整流程的逻辑(整体的概述) 首先,用户在地址栏中输入你的项目访问路径,然后这个请求会发送到服务器,之后服务器发现在web.xml中配置了一个filter过滤器,并且这个过滤器需要对 ...