簡體   English   中英

將數組轉換為結構指針

[英]Casting an array to a struct pointer

 #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只是數據[0]的地址。 如果是這樣的話,我會為其中一個打印出奇怪的值,對嗎?

理想情況下,我不認為我會使用這樣的代碼,但我在其他人的代碼中遇到了它,這是我寫的一個測試,看看發生了什么。

如果這個問題已經得到解答,我就找不到了,如果是這樣的話就道歉了。

在經過Étienne評論的帖子后回答我自己的問題:

“數組的地址與第一個元素的地址相同”

-John Bode(來自陣列的地址 - 有&符號和沒有&符號之間的區別

即對於名為“data”的數組:&data == data

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

感謝您的快速回復,Étienne!

p->data表示&p->data[0]在值上下文中使用時,因為它是數組的名稱。 這是指向數組第一個元素的指針。

&p->data是指向整個數組的指針。 當名稱與&sizeof一起使用時,將禁止將數組名稱轉換為指向第一個元素的指針的操作。

整個數組從與數組的第一個元素相同的內存位置開始,這就是為什么這些指針在轉換為公共類型時都包含相同的內存地址。

NB。 兩個指針使用相同的內部表示並不是標准要求,盡管幾乎所有系統都會這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM