2012-07-02 54 views
0

我不明白爲什麼這個程序打印「klmnop」而不僅僅是「klm」。 b是大小爲2的數組! 這是代碼:數組在c和struct

struct S 
{ 
    int i1; 
    int i2; 
    char b[2]; 
}; 

int main() 
{ 
    char a[] = "abcdefghijklmnop"; 

    struct S* s = a + 2; 
    printf("[%s]\n" , s->b); 

    return 0; 
} 
+0

你認識到這個代碼是UB在一個系統裏,sizeof(int)是8字節嗎?你想達到什麼目的? – Muggen

+0

從符合標準的角度來看,這是一場災難,從'char *'到'struct S *'的隱式轉換並沒有真正的對齊保證。但我認爲這一點很清楚。它可能只是'printf(「[%s] \ n」,a + 10)'。它看起來像是一個更大的非假設問題的簡化形式。 –

回答

2

printf("[%s]\n" , s->b);因爲打印從S->的地址數據b到字符'\0'。在地址s->b之後,只要它會找到'\0'它就會打印數據。

char b[2]; 

上述聲明不包括'\0'在最後一個字符,因此將繼續從地址讀取數據,直到它找到字符串結束'\0'

+2

我認爲你的意思是字符'\ 0' – Muggen

+0

你是錯誤的,我糾正了它.. –

5

最喜歡的字符串函數,您的printf沒有任何信息關於包含該字符串的數組的大小。它只有一個指向單個字符的指針,並且您承諾此char是由'\0'終止的一系列字符中的第一個字符。當被要求打印整個字符串時,它會一直持續,直到找到終止符或崩潰,以先到者爲準。