C语言学习笔记---结构体中的字符数组和字符指针
在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串。比如:
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语言学习笔记---结构体中的字符数组和字符指针相关推荐
- Go语言学习笔记——结构体中使用tag标记
文章目录 golang结构体中使用tag标记 简介 语法结构 快速入门 常见应用 应用json编码 应用xml编码 应用form表单绑定 gin框架form和数据绑定 golang结构体中使用tag标 ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- C语言学习笔记---结构体的定义和初始化
在C语言中结构体通常用来将不同类型的变量打包在一起,方便对对象的统一管理. 结构体定义 要使用结构体时,首先要进行结构体的声明.声明的形式如下: struct 结构体名{ 结构体所包含的变量} ...
- C语言学习笔记---结构体指针
既然结构体是一种数据类型,那么除了使用变量本身来访问结构体之外,也可以使用指针来访问结构体.下面通过一个简单的例子来演示一下: struct Date{int year;int month;int ...
- C语言学习笔记---结构体作为函数参数和返回值
结构体不仅可以作为函数的参数传递,也可以作为函数的返回值.现在就分别来看一下这两种情况. 结构体作为参数 struct score {int chinese;int math;int englis ...
- C语言学习笔记---结构体数组初始化
既然结构体是一种数据类型,那么它也可以定义为数组的形式.比如要描述一本书的信息,可以将书的名称,作者,价格这些信息用一个结构体来描述,在使用的过程中不可能只描述一本书,所以就需要使用一个结构体数组 ...
- SV学习笔记—结构体及枚举类型及字符串
目录 1.结构体 1.1 压缩结构体 1.2 非压缩结构体 1.3联合结构体 2.枚举类型 3.字符串 1.结构体 Verilog的最大缺陷之一是没有数据结构,SV中可以使用struct语句创建结构, ...
- C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)
获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...
- Go语言学习、结构体
最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧. 武汉加油! 我们来继续说下go语言中的结构体 比如我们现在想存储一个学生信息,如:学号.姓名.年龄.性别,等信息,按照我们以前的存储习惯, ...
最新文章
- C#面向对象_抽象类
- 利用Hadoop Streaming处理二进制格式文件
- 【小白学习C++ 教程】二十二、C++ 中的STL容器stack、queue和map
- pytorch 和nltk 结合训练的例子
- 算法----最大承载量下的最大价值问题
- python3 安装Crypto 出现的问题
- [转]CNN目标检测(一):Faster RCNN详解
- spark on yarn yarn-client模式实现源码走读
- AlexNet原理及tensorflow实现
- [JSOI2008]火星人 hash+splay
- 文件——rstrip() 、lstrip()和 strip()、zip() 函数
- TOP15 科幻小说系列
- 寒风里的凌厉香气,令人沉醉的男士魅力
- python 判断字符串中的的起始、终止子字符串
- javax.faces.FacesException: Unable to find CDI BeanManager的解决方法
- 电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
- 销毁一颗二叉树--Destroy(Node* root)
- Dynamodb 备份方案
- web项目图片/文件保存方式
- 中原工学院大学计算机挂科,挂科