加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将数组转换为结构指针

发布时间:2020-12-16 07:08:18 所属栏目:百科 来源:网络整理
导读:#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]; }; struc
#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%02xn",p->data[0],testCmd1->cmd,testCmd2->cmd);
    printf("0x%02x 0x%02x  0x%02xn",p->data[1],testCmd1->main,testCmd2->main);
    printf("0x%02x 0x%02x  0x%02xn",p->data[2],testCmd1->sub,testCmd2->sub);
    printf("0x%02x 0x%02x  0x%02xn",p->data[3],testCmd1->index,testCmd2->index);    
    return 0;
}

运行上面的代码打印出来:

0xbc 0xbc 0xbc

0xde 0xde 0xde

0xff 0xff 0xff

0x01 0x01 0x01

我想知道为什么& p->数据和p->数据似乎被解析到同一地址.

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

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

如果这个问题已经得到解答,我就找不到了,如果是这样的话就道歉了.

解决方法

在经过étienne评论的帖子后回答我自己的问题:

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

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

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

因此,在我的情况下,& p->数据与p->数据的地址相同.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读