2013-04-18 29 views
0

我的機器是32位PC,運行centos系統,我用GCC編譯我的C代碼。 而int變量佔用4 bytes.So我寫這樣的代碼......int變量的第四個字符有什麼問題?

#include "stdio.h" 
    int main(){ 
      int a=1; 
      printf("%c",*(&a+1)+65); 
      printf("%c",*(&a+2)+65); 
      printf("%c",*(&a+3)+65); 
    } 

我的想法是這樣的: PC處於32位,所以變量a shoule存儲在內存中是這樣:

&a 00000001 
    &a+1 00000000 
    &a+2 00000000 
    &a+3 00000000 

所以我想答案應該是:AAA
但是是什麼是真正的了:QA(最後一個沒有打印出來。)
我的結果感到困惑。而且更重要的是,如果我消化最後兩個printf.which是:

#include "stdio.h" 
    int main(){ 
      int a=1; 
      printf("%c",*(&a+1)+65); 
    } 

然後我得到了我想要的東西:一個
有什麼不對我的代碼或什麼,真實的錯誤是我講的變量存儲思考在內存中...請幫我擺脫這些東西,謝謝。

+2

你真的應該使用位掩碼爲這個而不是指針運算遞增的a地址。 – Pubby

+0

此外,這段代碼是依賴於endian和不可移植的。 – Lundin

回答

1

當您說「& a + 1」不等於+1字節時,意味着+1 sizeof(int)。

如果您將& a轉換爲char *,那麼您的+1將意味着+1 sizeof(char)。 char的大小將是1個字節。

3

這裏,&aint*類型,所以&a+1指向下一個int(之後4個字節)。您需要到&a轉換爲char*((char *) &a) + 1

0

投你指針&achar *指針這樣

printf("%c",*((char*)&a+1)+65); 

&a + 1意味着你已經增加的a地址與1 *尺寸a和大小a是4字節= 4 *字符的大小。

鑄造achar *指針的地址西港島線允許有1個*的sizeof字符(= 1個字節)

+0

謝謝你。我明白了。 – user2109469

+0

@ user2109469歡迎光臨 – MOHAMED

相關問題