[英]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.