gpt4 book ai didi

将数组转换为结构指针

转载 作者:太空狗 更新时间:2023-10-29 15:40:48 24 4
gpt4 key购买 nike

 #include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_PARMS 20
#define DATA_MAX 50
struct s {
uint8_t cmd;
uint8_t main;
uint8_t sub;
uint8_t index;
uint8_t reg;
uint8_t sendlen;
uint8_t reclen;
uint8_t parm[MAX_PARMS];
};
struct t {
uint8_t hdr;
uint8_t data[DATA_MAX];
uint8_t len;
};

int main()
{
struct t *p = malloc(sizeof(struct t));
p->data[0] = 0xBC;
p->data[1] = 0xDE;
p->data[2] = 0xFF;
p->data[3] = 0x01;

struct s *testCmd1 = (struct s *) &p->data;
struct s *testCmd2 = (struct s *) p->data;
printf("0x%02x 0x%02x 0x%02x\n", p->data[0], testCmd1->cmd, testCmd2->cmd);
printf("0x%02x 0x%02x 0x%02x\n", p->data[1], testCmd1->main, testCmd2->main);
printf("0x%02x 0x%02x 0x%02x\n", p->data[2], testCmd1->sub, testCmd2->sub);
printf("0x%02x 0x%02x 0x%02x\n", p->data[3], testCmd1->index, testCmd2->index);
return 0;
}

运行上面的代码打印出:

0xbc 0xbc 0xbc

0xde 0xde 0xde

0xff 0xff 0xff

0x01 0x01 0x01

我想知道为什么 &p->data 和 p->data 似乎被解析到同一个地址。

在我看来 &p->data 应该是指向 data[0] 地址的指针,而 p->data 只是 data[0] 的地址。如果是这样的话,我会为其中之一打印出奇怪的值,对吗?

理想情况下,我不认为我会使用这样的代码,但我在其他人的代码中遇到过它,这是我编写的测试以查看发生了什么。

如果这个问题已经得到回答,我找不到它,如果是这样的话,我们深表歉意。

最佳答案

在浏览了 Étienne 评论的帖子后回答我自己的问题:

“数组的地址与第一个元素的地址相同”

-John Bode(来自Address of array - difference between having an ampersand and no ampersand)

即对于名为“data”的数组:&data == data

所以在我的例子中,&p->data 与 p->data 的地址相同。

感谢您的快速回复,Étienne!

关于将数组转换为结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22673858/

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