是否可以使用指针数学来移动结构并将数据分配给其成员?我有一个只有uint8_t数据的大型结构,并且编写结构的所有这些成员的名称是很多工作.我希望我可以只指定一个指向第一个数据的指针,然后将8添加到该地址.这可能吗?
/* All pieces of data are the same size */
typdef struct
{
uint8_t a;
uint8_t b;
uint8_t c:
}Mydata;
int main(void){
/* New struct created */
Mydata NewData;
/* Pointer P points to the address of "NewData"*/
uin8_t *p = &NewData;
*p = 5;
p = p + 1; // increment 1 byte to next address where data is stored
*p = 7;
p = p + 1;
*p = 10;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
指针数学以字节为单位,而不是位.
所以你建议添加8位,实际上你应该添加1字节
结构布局不保证是连续的.编译器可以选择在结构中间放置额外的空格,以帮助进行对齐和内存访问.即使你可能不知道它,也可能有:
typdef struct
{
uint8_t a;
char padding_A[3];
uint8_t b;
char padding_B[3];
uint8_t c:
}Mydata;
Run Code Online (Sandbox Code Playgroud)
这将摒弃你的假设和数学.
您通常可以使用特定于编译器的属性(例如#pragma pack或)来解决此问题__attribute__((__packed__))
最后,如果您使用过这种技术,很少有工程师能够轻松维护您的代码.如果结构的任何成员的类型已更改,如果添加或删除任何成员,则必须仔细更新之后的每个元素访问.错误的风险是巨大的.
有一个可用的公共宏,称为offsetof可以从结构的开头计算成员的字节偏移量.这可以避免我概述的许多问题,并偶尔用于编写高度专业化的代码.
如果必须这样做,请使用offsetof宏,但在此之前,请采取一切可能的预防措施,以避免首先需要这种技术.