likes
comments
collection

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

作者站长头像
站长
· 阅读数 11

「这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战」。

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

struct str
	{
		char s1[5];
		char s2[5];
	};

	struct str str1= {"123","abc"};

或者

	struct str
	{
		char *s1;
		char *s2;
	};

	struct str str1= {"123","abc"};

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

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

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

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

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

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

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

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

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

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