在结构体中可以使用字符数组来存储字符串,也可以使用字符指针来存储字符串。比如:
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个字节。结构体不用为字符串分配任何存储空间,它使用的是存储在其他地方的字符串。这样的话存储字符串的位置就是不固定的,这样的话在程序运行过程中就会有潜在的危险。如果存储字符串位置附近的数据发生了溢出,那么字符串就会有被篡改的风险。因此如果结构体中存有重要数据,尽量还是使用字符数组来存储字符串比较安全。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_20222919/article/details/121206094
内容来源于网络,如有侵权,请联系作者删除!