2012-05-21 36 views
2

閱讀器,C陣列,我的記憶會發生什麼

任何人都可以向我解釋當我運行這段錯誤代碼時,在我的計算機中會發生什麼。 用gnu gcc編譯器編譯。在代碼塊中。

這是錯誤的代碼:

char data[5]; 

    data[0] = '1'; 
    data[1] = '10'; 
    data[2] = '30'; 
    data[3] = '50'; 

    if(sizeof(data) == 5) 
    { 
    adjust(data); 
    } 

的sizeof(數據)爲5,因爲我聲明char數據[5]

如果我嘗試讀取數據[1],我注意到它會返回最後一個字符。 '0''48'

所以我想知道,數據[1]中的'1'會發生什麼,我的記憶會發生什麼?

+0

是字符文字與更多的一個字符被編譯器接受(特殊情況像十六進制'0x1'我知道是)但一般? –

+0

顯然char文字被截斷爲單個字符。 – joey

回答

3

您使用多字符文字(如10)有點令人困惑,這可能會增加您的困惑。

data[1] = '10'; 

是:將這樣的線路發生什麼

char
    • int型(char,在C)值'10'將被截斷下產生的值將被分配到。

    這個值恰好依賴於編譯器,因爲它的字面大於單個文件的大小。

    如果您看到0(在ASCII系統上數字爲48),這意味着10被截斷爲0,這是存儲的值。然後1完全丟失(未存儲在陣列的相鄰插槽中,您可能已經預料到了這一點)。

  • +0

    謝謝,說清楚。 – joey

    1

    除的adjust()的影響,會發生什麼是相當清楚的:

    • data[]與5個元素
    • 第一至第四元素被定義
    • data[]大小與5相比,分配
    • adjust()用指針調用data[]

    我不理解你對於閱讀的意見。它包含未分配的東西,直到分配。

    char x = '10';與大多數體系結構上的char x = '0'相同。這是從C++的行爲背離。表達式大多作爲整數處理,然後在存儲時隱式地進行類型轉換。

    +0

    非常感謝你的回答wallyk。我學到了一些新東西。 – joey