【问题标题】:Casting an array to a struct pointer将数组转换为结构指针
【发布时间】:2014-03-26 21:53:53
【问题描述】:
 #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] 的地址。如果是这样的话,我会为其中一个打印出奇怪的值,对吗?

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

如果这个问题已经回答了,我找不到,如果是这样的话,很抱歉。

【问题讨论】:

标签: c struct casting


【解决方案1】:

阅读 Étienne 评论的帖子后回答我自己的问题:

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

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

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

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

感谢您的快速回复,艾蒂安!

【讨论】:

  • 没问题 ;-) 随意接受你自己的答案!
  • 显然我必须等待 2 天才能接受它。不知道为什么,可能是我刚加入...
【解决方案2】:

p-&gt;data 在值上下文中使用时表示&amp;p-&gt;data[0],因为它是数组的名称。这是指向数组第一个元素的指针。

&amp;p-&gt;data 是指向整个数组的指针。当名称与&amp;sizeof 一起使用时,将禁止将数组名称转换为指向第一个元素的指针的操作。

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

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

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2023-03-26
    • 1970-01-01
    • 2014-09-07
    • 2014-08-16
    相关资源
    最近更新 更多