有个疑问,看《C Primer Plus》的第4章里面有提到
再看看以下写的测试程序
// 例1
char name[10] = "1234567890";
printf("%d\n", sizeof(name)); // 10
printf("%d\n", strlen(name)); // 10
printf("%s\n", name); // 1234567890
// 例2
char a[] = "123";
printf("%d\n", sizeof(a)); // 4
printf("%d\n", strlen(a)); // 3
sizeof 既然包括 \0,那为什么例1里的 sizeof 输出是 10,而不是11,即使为10,那减去 \0 这个字节后,剩下的字节空间不应该是 9 吗,例1里的 name 输出不应该是“123456789”?
例2里的结果,我倒是比较理解,因为 a 里其实有个隐藏的字节存储 \0。
例1的程序和我所期待的结果有出入,想请教下各位大佬,应该如何去理解 sizeof ?。
----- 补图 -----
看了书本的第六章的11小节......这才是正确的答案,在C语言里,虽然字符串是用字符数组来存储,但是字符数组并不一定是字符串,从概念上来看,字符数组末尾可以没有\0,字符串末尾必须有\0。也就是说例1的 name 数组是合法的,sizeof 是用于得到数组的长度,sizeof(name) 自然等于10,name 数组不包含\0,所以它不是字符串,只是一个字符数组,而例2 里的 a 数组既是字符数组,也是字符串。
另外:
char a[] = "123"; // 会自动补 \0
char a[3] = "123"; // 不会自动补 \0
###首先name
和a
后面都带有一个\0
,但是你指定了name
的长度,所以'1234567890'
后面的\0
被截取了。而a
因为没有指定长度,编译器给你分配了适当的长度,所以\0
被保留了。你将第一行改为char name[] = "1234567890"
则一切正常了。 sizeof不在乎包不包含\0的问题,sizeof是求数组的长度,它在编译器就确定,它不会在乎你数组中存的是什么。而strlen才在乎是否含有\0
例1是不对的,学c语言刚开始就会告诉你字符数组的最后一个是'\0',因此长度为10的数组只能存9个字符,你的能通过是编译器不严谨,我用g++是不能通过编译的。
如果最后一个元素不是'\0',printf会一直输入,直到遇到内存中的'\0'