繁体   English   中英

是否可以使用C语言中的指针数学来访问结构中的数据?

[英]Is it possible to access data in a struct using pointer math in C?

是否可以使用指针数学在结构中移动并将数据分配给其成员? 我有一个仅包含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;
}

指针数学以字节为单位 ,而不是位。
因此,在您建议加8位的地方,实际上应该添加1字节

结构布局不保证是连续的。 编译器可以选择在结构的中间放置其他空格,以帮助对齐和访问内存。 即使您可能不知道,也可能有:

typdef struct 
{
    uint8_t a;
    char    padding_A[3];
    uint8_t b;
    char    padding_B[3];
    uint8_t c:
}Mydata;

这将偏离您的假设和数学。
您通常可以使用特定于编译器的属性来解决此问题,例如#pragma pack__attribute__((__packed__))

最后,如果您曾经使用过这种技术,那么很少有工程师会愿意维护您的代码。 如果结构的任何成员的类型发生了更改,如果添加或删除了任何成员,则此后的每个单个元素访问都必须仔细更新。 错误的风险是巨大的。

有一个通用的可用宏,称为offsetof ,可以从结构的开头计算成员的字节偏移。 这样可以避免我概述的许多问题,并且偶尔可以用来编写高度专业的代码。

如果必须执行此操作,请使用offsetof宏,但在此之前,请采取一切可能的预防措施,以避免首先使用此技术。

尽管这几乎总是一个错误的决定,但由于它会导致可移植性和代码可读性方面的错误,因此可以这样做。

C语言中的指针数学基于指针的数据类型。 编译器需要知道指针中每个元素的大小才能知道如何增加偏移量。

将指针声明为uint8_t *p因为您正在遍历uint8_t 然后,每次要转到结构中的下一个成员时,只需使用p++ (因为编译器知道指针的类型,所以它知道“ 1”单元等效)。

我建议学习指针数学(以及指针,因为它们是C的主要组成部分,因此通常也应加以研究),更重要的是,出于实用性考虑,我强烈建议不要使用指针数学。

编辑:拼写错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM