gpt4 book ai didi

c - 用于访问结构中元素的指针操作

转载 作者:行者123 更新时间:2023-11-30 15:30:08 25 4
gpt4 key购买 nike

给出下面的简单代码,其中 process_payload 被赋予指向数据包有效负载部分的指针,如何访问 header 部分?理想情况下,调用者应该简单地从头开始提供一个指向完整数据包的指针,但在某些情况下,您没有消息的开头,需要向后工作才能获取 header 信息。我想这个问题变成了对结构体内存布局的理解。

header 通过 sizeof 运算计算为 8 个字节。我假设 Visual C++ 编译器向 header 添加了 3 个字节填充。在执行 ptr arith (pptr->payload - pptr) 时,pptr 和 pptr->payload 之间的差异是十进制 80(不知道为什么是这个值??)。设置 ptr = (struct Packet*)(payload - 80) 有效,但似乎更像是一种黑客行为。我不太明白为什么减去 sizeof(struct header) 不起作用。

感谢您提供的任何帮助。

struct Header
{
unsigned char id;
unsigned int size;
};

struct Packet
{
struct Header header;
unsigned char* payload;
};


void process_payload(unsigned char* payload);

int main()
{
struct Packet* pptr = (struct Packet*)malloc(sizeof(struct Packet));
pptr->payload = (unsigned char*)malloc(sizeof(unsigned char)*10);

process_payload(pptr->payload);

return 1;
}

// Function needs to work backwards to get to header info.
void process_payload(unsigned char* payload)
{
// If ptr is correctly setup, it will be able to access all the fields
// visible in struct Packet and not simply payload part.
struct Packet* ptr;

// This does not work when intuitively it should?
ptr = (struct Packet*)(payload - sizeof(struct Header));
}

最佳答案

因为在 main您分配两个指针,并将第二个指针传递给 process_payload功能。这两个指针不相关。

有两种方法可以解决此问题,两者都包含单个分配。

第一个解决方案是使用所谓的灵活数组,其中结构中最后一个数组成员没有任何大小:

struct Packet
{
struct Header header;
unsigned char payload[];
};

要使用它,您需要进行一次分配,其中结构的大小加上有效负载的大小:

struct Packet *pptr = malloc(sizeof(struct Packet) + 10);

现在pptr->payload像指向 10 个无符号字符的普通指针一样处理。

另一种解决方案是当前解决方案和灵活数组解决方案的混合,是进行一次分配并创建 payload指向单个分配的内存块中正确位置的指针:

struct Packet
{
struct Header header;
unsigned char *payload;
};

// ...

struct Packet *pptr = malloc(sizeof(struct Packet) + 10);
pptr->payload = (unsigned char *) ((char *) pptr + sizeof(struct Packet);

请注意,在本例中,要获取 Packet结构来自payload指针,你必须使用sizeof(Packet)而不是仅 sizeof(Header) .

<小时/>

关于上面的代码有两点需要注意:

  1. don't cast the result of malloc
  2. sizeof(char) (以及 unsigned char 的大小)被指定为始终为 1,因此不需要 sizeof

关于c - 用于访问结构中元素的指针操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25782763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com