将数组转换为结构体指针

4
 #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] 的地址。如果那样的话,其中一个变量将会打印出错误的值,对吗?
理想情况下,我不认为我会使用这样的代码,但我在别人的代码中遇到了它,这是我写的一个测试,以了解具体情况。
如果已经回答了这个问题,但我没有找到它,请谅解。

3
查看 https://dev59.com/DGsz5IYBdhLWcg3wuKQm - Étienne
3
甚至更好的是在这里:https://dev59.com/rXE85IYBdhLWcg3wMQlm原文含义:提供了一个指向问题描述的链接。 - Étienne
2
请参见这里这里 - Matt Eckert
2个回答

1

在查看Étienne评论的帖子后,我回答了自己的问题:

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

-John Bode(来自数组地址-有无&的区别

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

因此,在我的情况下,&p->data与p->data具有相同的地址。

感谢快速响应,Étienne!


没问题;-) 随意接受你自己的答案! - Étienne
显然我必须等待2天才能接受它。我不知道为什么,也许是因为我刚加入... - user3466208

0

p->data 在值环境中表示 &p->data[0],因为它是一个数组的名称。这是指向数组第一个元素的指针。

&p->data 是指向整个数组的指针。当使用 &sizeof 时,抑制了将数组名转换为指向第一个元素的指针的操作。

整个数组从与数组的第一个元素相同的内存位置开始,这就是为什么这些指针在转换为常见类型时都包含相同的内存地址。

NB. 并不是标准要求这两个指针使用相同的内部表示,尽管几乎所有系统都会这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接