结构体的使用方法

本文介绍了C语言中结构体数据的两种初始化方法,联合结构体的使用以及如何处理字节对齐问题,特别提到了小端模式下可能遇到的不匹配问题和使用`pragmapack`进行数据对齐的方法。
摘要由CSDN通过智能技术生成

一、结构体数据初始化

初始化方法很多,这里仅举例两种常用的初始化方法,如下:

struct {
int month;
int day;
int year;
}data;
data today={.month = 1,.year = 2};
data today={0,1,1};

二、联合结构体

typedef union
{
    u8 	buf[6];
	struct {
		        u8	AA;
		        u8	BB;
			    u8	CC;
			    u8	DD;
			    u8	EE;
			    u8	FF;
		    }MSG;
}U_TEST;

代表buf[6]与下面的AA等公用一片地址,即buf[0]的地址等于AA的地址。

三、字节对齐

使用联合结构体作为数据接收时很好用,因为存储时是小端模式(即低位地址在前高位地址在后),对于多字节数据,只需要按小端模式发送数据,就可以直接组合数据使用,但是若字节量不对齐时,即出现 u8,u8,u8,u16,u8时,由于默认的编译方式,会将第三个u8保留u16的空间,从而解读数据时出现错误,此时可以使用#pragma pack来对齐数据,使用方法如下,参考站内链接也在下方:

typedef union
{
    u8 	buf[6];
    #pragma pack(1)
	struct {
		        u8	AA;
		        u8	BB;
			    u8	CC;
			    u16	DD;
			    u8	EE;
		    }MSG;
    #pragma pack()
}U_TEST;

参考站内文章如链接

需要注意的是,如果结构体中定义一个其他结构体类型的变量,需要将定义的结构体也使用此关键词定义,否则可能造成数据指针错误使程序进入hardfault。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
结构体是一种自定义的数据类型,用于存储不同类型的数据项。它允许我们将多个相关的数据项组合在一起,形成一个逻辑上的实体。 在C语言中,我们可以使用关键字`struct`来定义结构体,并在结构体内部定义数据项的类型和名称。下面是一个简单的例子: ```c struct Person { char name[50]; int age; float height; }; ``` 上面的代码定义了一个名为`Person`的结构体,它包含了三个数据项:`name`、`age`和`height`,分别表示人的姓名、年龄和身高。 我们可以使用结构体来创建具体的实例,并对其进行操作。例如,可以通过以下方式声明一个名为`person1`的结构体变量,并给其赋值: ```c struct Person person1; strcpy(person1.name, "John"); person1.age = 25; person1.height = 1.75; ``` 上述代码中,我们使用了`strcpy`函数将字符串“John”复制到`person1.name`中,然后分别赋值给了`person1.age`和`person1.height`。 我们还可以通过点运算符来访问结构体中的数据项。例如,可以使用以下方式输出`person1`的信息: ```c printf("Name: %s\n", person1.name); printf("Age: %d\n", person1.age); printf("Height: %.2f\n", person1.height); ``` 通过点运算符,我们可以访问结构体中的各个数据项,并在程序中进行相应的操作。 需要注意的是,结构体的成员变量默认是`public`的,即可以直接通过结构体变量访问。如果需要限制访问权限,可以使用C语言中的其他方式,如在结构体定义中使用关键字`private`或者通过函数来操作结构体。 这就是结构体的基本使用方法,希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值