2011-11-23 92 views
4
void main() 
{ 
    char s[]="\12345s\n"; 
    printf("%d",sizeof(s)); 
} 

的工作當我編譯它,它給6.我不是佔有,爲什麼它給6 insted的8。 像{'\1','2','3','4','5','s','\n'}SizeOf函數返回的字符數組

請有誰能夠告訴其原因,我想要一些深刻而清晰的解釋。我會感謝他們。

+3

嘗試打印's',然後你應該看看發生了什麼。 –

+1

在printf調用中有UB:格式指定了一個int,但sizeof提供了一個size_t。 – pmg

+0

[sizeof數組和指針]可能的重複(http://stackoverflow.com/questions/13672162/sizeof-array-and-pointers) –

回答

12

因爲\123被認爲是一個字符,所以它是一個轉義序列(八進制)。所以sizeof計算5個字符'\123','4','5','s','\n'和結尾'\0'

+0

不會給它4無論如何它的思考指針不管字符串是什麼? – Dineshkumar

+0

@Dineshkumar char *和char []之間有區別,這裏's'是一個數組,所以'sizeof'返回數組的大小。在陣列衰減成指針的情況下,例如,傳遞給函數'foo(char * p)'sizeof'將返回4(或指針通常具有的任何大小 - 取決於操作系統) –

1
char s[]="\12345s\n"

等於:

char s[] = { '\123', '4', '5', 's', '\n', 0 }

所以六個總元件。

+0

elmo這就是我爲什麼要考慮{'\ 123',' 4','5','s','\ n',0}爲什麼不是{'\ 1','2','3','4','5','s','\ n' } –

+1

@Nishant:如果你想讓「\ 12」被識別爲{'\ 1','2'},你需要輸入「\ 0012」。 – alk

+0

@Nishant因爲否則你就不能在反斜槓後指定任何超過一位的數字。正如烷說的是要走的路。如果它確實把\ 123作爲\ 1,2和3,您將如何指定\ 123? – elmo

2
char s[]="\12345s\n"; 

\表示轉義序列 如果號碼用於高達3個地方,缺省爲八進制。 所以\ 123將在八進制作爲 進行評估 - > 8 * 8 * 1 + 8 * 2 + 3 = 83 所以如果打印這個你會發現它 S45s 爲S - >對應的ASCII碼的83 因此,大小也是4.