先看以下代码
int main() {
char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g' };
printf("%d\n", sizeof(acX));
printf("%d\n", sizeof(acY));
printf("%d\n", strlen(acX));
printf("%d\n", strlen(acY));
return 0;
}
运行结果
sizeof
在这里我们可以把sizeof看成宏观的大小,sizeof(acX)为什么是8,因为我们知道这种连起来的字符最后一位使用\0来阻断的。也就是说虽然你看到显示的是abcdefg7个字符但其实最后一位还有一个\0,只是没显示出来而已。所以说sizeof(acX)是8.
而第二种的char acY[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’ };是不需要\0的,因为他们用单引号引起来了,几个就是几个,不需要截至。
strlen
在这里我们可以把sizeof看成微观的大小,它只拾取到截至符号\0前一位。就像char acX[] = “abcdefg”;实际上是abcdefg\0,\0不算所以就是7。
而第二个就比较离谱了,为什么差的那么大。这个其实也是一样的,它只会拾取\0才会停止,我们把内存调出来看一下。
调出内存发现到24位时才是00,也就是\0。
所以说printf(“%d\n”, strlen(acY));的输出结果是23。