2013-10-30 56 views
0

我有無符號長,我期望成爲每個數組元素的4個字節(32位),這樣的陣列:爲什麼我的無符號長數組的指針增加8個字節而不是4個?

unsigned long giantbuffer[1024]; 

然而,當我打印出我的數組元素的我得到的地址:

printf("%X\n", &giantbuffer[0]); --> gives ab8470 

printf("%X\n", &giantbuffer[1]); --> gives ab8478 

也,

sizeof(giantbuffer) gives 8192, and sizeof(giantbuffer[0]) gives 8. 

即每個數組元素八個字節!這是依賴於系統架構的東西嗎?我是C新手,所以也許這是一件顯而易見的事情?這對我的指針算術造成了巨大的破壞。我正在使用「ch」對我的語法做一些解釋器命令行樣式檢查等。也許這是該程序的問題?

+2

爲什麼你期望'long'是4字節長?任何合理的64位體系結構/實施我知道定義的'long'作爲一個64位的類型。如果你想要一個特定大小的整(是的,Win64中並不算是一個明智的實現。) – 2013-10-30 06:41:19

+0

,使用stdint.h –

回答

4

因爲在您的環境中,sizeof unsigned long是8個字節。指針運算取決於對象的類型指出:

int i = 10; 
int *p_i = &i; 

遞增p_i由1 - 增加了指針與sizeof(int)字節。

char c = 10; 
char *p_c = &i; 

遞增p_c由1 - 增加了指針與sizeof(char)字節,等等。

這東西是依賴於系統結構的東西?

是的。它還取決於您的編譯器,以及體系結構是否爲32/64位。

+0

我覺得還添加有關指針的數學是如何工作的 –

+1

@GrijeshChauhan從問題推導,我想知道OP指針運算如何工作。他只是一個大概的數據類型的大小錯誤的假設的受害者。 – 2013-10-30 06:43:33

+0

@ H2CO3嗯正確!!我閱讀標題和前兩個代碼片只有 –

4

如果您需要字節的特定量的數據類型,不要使用類型,如unsigned long。相反,請查看諸如stdint header之類的內容。

相反的:

unsigned long myvar = 0; 
unsigned long mybuf[100]; 

你會怎麼做:

uint32_t myvar = 0; 
uint32_t mybuf[100]; 

,你會得到一個32位的值,無論你走到哪裏。

澄清: 根據您的系統體系結構,uint32_t得到typedef「版,以unsigned intunsigned long。這通常通過使用如下預處理器宏來處理:

#ifdef __x86_64__ 
typedef unsigned int uint32_t; 
#else 
typedef unsigned long uint32_t; 
#endif 
相關問題