在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串。比如:

struct str{char s1[5];char s2[5];};struct str str1= {"123","abc"};

或者

 struct str{char *s1;char *s2;};struct str str1= {"123","abc"};

  通过这两种方式定义的结构体都可以正常运行,输出结果也都是一样的。

  那么这两种方式在内存中存储是否有区别?为了方便观察内存中的数据,将上面的代码移植到单片机中。

  首先使用字符数组来存储字符串。

  当初始化完s1的值之后,在内存中观察结构体的存储位置,str1的存储位置从0x0003F4开始,按顺序依次存储两个字符数组的值。直到0x0003FD结束。通过内存中的数据可以看出,str1和str1.s1其实是同一个地址。

  下面使用指针来存储字符串。


  通过内存中的数据可以看到,指针s1的存储地址为0x0003FA,在这个地址处又存储了字符串"123"的起始地址0x009B7E,指针s2的存储地址为0x0003FC,在这个地址处又存储了字符串"abc"的起始地址0x009B82。接着再去0x009B7E和0x009B82地址观察,这两个地址中存储的是真正字符串的值。

  通过对内存中存储的数据观察可以知道,如果定义为字符数组,那么字符串是存储在结构体的内部,结构体总共要分配10个字节来存储字符串。这些字符串都存储在编译器存储常量的地方。如果定义为字符指针,那么结构体本身只存储两个地址,总共占4个字节。结构体不用为字符串分配任何存储空间,它使用的是存储在其他地方的字符串。这样的话存储字符串的位置就是不固定的,这样的话在程序运行过程中就会有潜在的危险。如果存储字符串位置附近的数据发生了溢出,那么字符串就会有被篡改的风险。因此如果结构体中存有重要数据,尽量还是使用字符数组来存储字符串比较安全。

C语言学习笔记---结构体中的字符数组和字符指针相关推荐

  1. Go语言学习笔记——结构体中使用tag标记

    文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...

  2. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  3. C语言学习笔记---结构体的定义和初始化

      在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义   要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...

  4. C语言学习笔记---结构体指针

      既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体.下面通过一个简单的例子来演示一下: struct Date{int year;int month;int ...

  5. C语言学习笔记---结构体作为函数参数和返回值

      结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...

  6. C语言学习笔记---结构体数组初始化

      既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...

  7. SV学习笔记—结构体及枚举类型及字符串

    目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...

  8. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

  9. Go语言学习、结构体

    最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧. 武汉加油! 我们来继续说下go语言中的结构体 比如我们现在想存储一个学生信息,如:学号.姓名.年龄.性别,等信息,按照我们以前的存储习惯, ...

最新文章

  1. C#面向对象_抽象类
  2. 利用Hadoop Streaming处理二进制格式文件
  3. 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map
  4. pytorch 和nltk 结合训练的例子
  5. 算法----最大承载量下的最大价值问题
  6. python3 安装Crypto 出现的问题
  7. [转]CNN目标检测(一):Faster RCNN详解
  8. spark on yarn yarn-client模式实现源码走读
  9. AlexNet原理及tensorflow实现
  10. [JSOI2008]火星人 hash+splay
  11. 文件——rstrip() 、lstrip()和 strip()、zip() 函数
  12. TOP15 科幻小说系列
  13. 寒风里的凌厉香气,令人沉醉的男士魅力
  14. python 判断字符串中的的起始、终止子字符串
  15. javax.faces.FacesException: Unable to find CDI BeanManager的解决方法
  16. 电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
  17. 销毁一颗二叉树--Destroy(Node* root)
  18. Dynamodb 备份方案
  19. web项目图片/文件保存方式
  20. 中原工学院大学计算机挂科,挂科

热门文章

  1. NSUserDefaults 添加与删除
  2. createjs入门
  3. 6个好用的Web开发工具
  4. (1)安装----anaconda3下配置pyspark【单机】
  5. 软件工程概论第十三周学习进度
  6. 【模板】链式前向星+spfa
  7. POJ 1064 Cable master (二分答案)
  8. HDU 4927 大数运算
  9. javascript阻止事件冒泡和浏览器的默认行为
  10. 花两个小时,做了个分页控件