2014-08-31 96 views
0

當您在C或C++中聲明int類型的變量x時,我知道它會佔用4個字節的內存。因此爲這個變量分配4個內存地址。我的問題是我可以看到所有四個內存地址分配這個變量?我知道這不是一個典型的問題,但我很好奇。還是100%總是隻有內存地址& x和接下來的3位?所以如果它是內存地址1000,那麼下一個將是1001,1002和1003?它有沒有偏離這一點?在C/C++中的內存分配

另外說我設置x = 5;

這是否意味着在這個內存位置1000到1002,它將被填充0,並在1003中,在最右邊的位置有101(二進制表示5)?

謝謝

+1

存儲器用於'int'保證是連續的,儘管它不是必需的一共4個字節。另一個問題取決於系統的字節順序。 – 2014-08-31 18:27:34

+0

什麼是[連續內存](http://stackoverflow.com/questions/4059363/what-is-a-contiguous-memory-block)。 – Igor 2014-08-31 18:28:38

+0

'&x'會給你第一個字節的地址 – Quest 2014-08-31 18:29:55

回答

6

int可以四個字節,儘管這真的取決於編譯器。因此爲什麼有特定大小的類型,如uint32_t。但是讓我們說出於參數的緣故,你的int是四個字節。

是的,這四個字節是連續的。所以你是正確的,&x和接下來的三個字節是你的變量的位置。

但是,假設最右邊的字節是最不重要的,對於big-endian機器纔是正確的。在一個小端架構(如86),最左邊的字節將包含101代表人數5

+1

「一個int可以是四個字節,但這實際上取決於編譯器。」更像是「依賴*體系結構/ ABI *」。 – kay 2014-08-31 18:34:22

+0

我們稱之爲「依賴實施」... – EOF 2014-08-31 18:35:50

+0

酷!我很高興你包括大端和小端,我正在採用一個機器組織,並開始談論這些東西。謝謝。 – Arrow 2014-08-31 18:46:41

2

爲int的大小並不總是4個字節,它是隻知道

char <= short <= int <= long <= long long 

你可以通過爲int的每個字節這樣

#include <stdio.h> 

void main() { 
    int A = 10; 
    int *intPtr; 
    char *charPtr; 
    size_t size = sizeof(int); 
    size_t i; 

    intPtr = &A; 
    printf("%d\n", *intPtr); 

    charPtr = (char*) intPtr; 
    for (i = 0; i < size; i++) { 
     printf("%d\n", *(charPtr++)); 
    } 

} 
1

一些不準確之處:

  1. int的大小是平臺相關的(儘管在大多數情況下的確是4字節)。

  2. 你是什麼意思「查看地址」?如果你想通過調試器觀察它,那麼繼續,你很可能會看到相鄰的地址。如果您想將int變量中訪問一個特定的地址,那麼你就可以很容易地用char指針這樣做:

    int x = 5;

    char* p = (char*)&x;

    您可以使用p[i]要想在訪問任何地址範圍0<=i<=sizeof(int)-1

  3. 的地址1000至1003年的內容依賴於底層的HW架構的字節序:

    • 在大端處理器,其內容(從低地址的高地址)將是0 0 0 5
    • 在小端處理器,其內容(從低地址向高地址)將5 0 0 0