我不明白爲什麼這個程序打印「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;
}
我不明白爲什麼這個程序打印「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;
}
printf("[%s]\n" , s->b);
因爲打印從S->的地址數據b到字符'\0'
。在地址s->b
之後,只要它會找到'\0'
它就會打印數據。
char b[2];
上述聲明不包括'\0'
在最後一個字符,因此將繼續從地址讀取數據,直到它找到字符串結束'\0'
我認爲你的意思是字符'\ 0' – Muggen
你是錯誤的,我糾正了它.. –
最喜歡的字符串函數,您的printf沒有任何信息關於包含該字符串的數組的大小。它只有一個指向單個字符的指針,並且您承諾此char是由'\0'
終止的一系列字符中的第一個字符。當被要求打印整個字符串時,它會一直持續,直到找到終止符或崩潰,以先到者爲準。
你認識到這個代碼是UB在一個系統裏,sizeof(int)是8字節嗎?你想達到什麼目的? – Muggen
從符合標準的角度來看,這是一場災難,從'char *'到'struct S *'的隱式轉換並沒有真正的對齊保證。但我認爲這一點很清楚。它可能只是'printf(「[%s] \ n」,a + 10)'。它看起來像是一個更大的非假設問題的簡化形式。 –