2011-11-23 80 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.