簡體   English   中英

使用結構指針分配數組

[英]Use struct pointer to assign array

我有以下代碼

typedef struct
    {
        int a;
        int b;
    }DATA;


int _tmain(int argc, _TCHAR* argv[])
{
    DATA *N = NULL;
    unsigned char buff[65536];
    N = (DATA*)&buff;
    N->a = 1000;
    N->b = 50000;
    for(int i =0; i < 8; i ++)
        printf("buff[%d]: %d\n", i, buff[i]);

    return 0;
}

呈現以下輸出:

buff[0]: 232

buff[1]: 3

buff[2]: 0

buff[3]: 0

buff[4]: 80

buff[5]: 195

buff[6]: 0

buff[7]: 0

有人可以告訴我buff數組以哪種方式分配嗎?

您可以將指針視為類型大小的說明符。 指針大致是與解引用時要考慮的大小關聯的地址。 當聲明int c = 2; int *p = &2; int c = 2; int *p = &2; 您正在將一個int的大小(例如4字節)與編譯器將定義的地址相關聯。 當您實際取消引用p, int x = *p ,編譯器知道您正在嘗試訪問地址p的4個字節。 現在,如果您成功地想到了這種方式,為什么用這種方式填充緩沖區的原因將一如既往。 您的無符號char數組是65536個字節的緩沖區。 當將地址“ buff”轉換為(DATA *)時,您將指定新的大小(DATA類型的大小)以進行取消引用。 因此,將在N-> a的4個字節上寫入1000,在N-> b的4個字節上寫入50000。 現在,小數點后的1000是十六進制的3E8; 由於需要寫入4字節,因此將對其進行符號擴展,並將寫入字節00、00、03,E8,正如您所期望的,十進制為字節0、0、3、232。現在您可能認為它們是以相反的順序寫,但這是由於耐力。 Endianess是處理器實際上將字節寫入內存的方式,在您的情況下,您的處理器以相反的順序寫入和讀取字節,因此按此順序將它們放入內存。 N-> b也是如此,因為十進制的50000等於十進制字節0、0、195、80。

您以little-endian格式將兩個4字節整數寫入緩沖區。 該程序的行為完全符合預期。

暫無
暫無

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

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