【嵌入式-LinuxC】一文带你搞清楚sizeof和strlen怎么计算字符串长度的

废话不多说,直接上代码~

#include<stdio.h>
#include<string.h>

int main(int argc, char *argv[])
{
    	// 这里分配给数组的长度为3,实际给到了7个字符数组,因此sizeof为3。当计算机分配了3个长度后,将不再把随后的值继续填充了,因此strlen实际上长度是随机的,遇到下一个\0就可以得到实际strlen长度。在我计算机上,始终看到的strlen是6,并且输出字符都是一摸一样的。
    	char s0[3] = {'a', 'p', '0', 'p', '\0', 'l', 'e'};
    	// 这里算的sizeof为初始化的空间大小,为10,strlen为遇到\0的长度-1,是5-1=4
        char s1[10] = {'a', 'p', '0', 'p', '\0', 'l', 'e'};
    	// 这里转义字符\不要当作一个字符,而要跟后面的符号一起算。因此sizeof总共空间是12, 但strlen遇到\0则结束,因此strlen算的是3
        char s2[] = "\t\\\%\0\\0mike\n";
    	// 这里ASCII 8进制最大值是177,\180超过8进制数,此时按照\1和80算,因此此时有6个字符.sizeof算出6,strlen则是5
        char s3[] = "\180\x99\n";
    	// 这里\150没有超过ASCII码8进制最大值,因此算1个字符。sizeof算出4个字符。strlen则是3个字符
        char s4[] = "\150\x99\n";

    	printf("sizeof(s0)=%ld, strlen(s0)=%ld\n", sizeof(s0), strlen(s0));
        printf("sizeof(s1)=%ld, strlen(s1)=%ld\n", sizeof(s1), strlen(s1));
        printf("sizeof(s2)=%ld, strlen(s2)=%ld\n", sizeof(s2), strlen(s2));
        printf("sizeof(s3)=%ld, strlen(s3)=%ld\n", sizeof(s3), strlen(s3));
        printf("sizeof(s4)=%ld, strlen(s4)=%ld\n", sizeof(s4), strlen(s4));
    
    	for(i = 0; i<6; i++)
        {
                printf("s0[%d]=%c, p=%p\n", i, s0[i], &s0[i]);
        }
    return 0;
}

/*
	结果如下:
		sizeof(s0)=3, strlen(s0)=6
		sizeof(s1)=10, strlen(s1)=4
		sizeof(s2)=12, strlen(s2)=3
		sizeof(s3)=6, strlen(s3)=5
		sizeof(s4)=4, strlen(s4)=3
		s0[0]=a, p=0x7fff5aabca25
		s0[1]=p, p=0x7fff5aabca26
		s0[2]=0, p=0x7fff5aabca27
		s0[3]=h, p=0x7fff5aabca28
		s0[4]==0x7fff5aabca29
		s0[5]=
		, p=0x7fff5aabca2a
	总结:
		sizeof计算实际分配给变量的字节数.只按分配的空间计算,不考虑\0、\t等各种特殊字符
		strlen计算实际的字符数,遇到\0即停止计算,并且\0不计算在strlen之内。\t、\\、\%等各种转义字符当作一个字符计算.
		在字符串"a\180\140\0x66"这种包含8进制和16进制的数据中,在范围内的数据只算作1个字符,也就是一个字节。超出范围的,只算\1和80,即只算\后面第一个字符当作一个转义字符,加上80两个,为3个字符。16进制应该是同理的。并且字符串"xxxx"是默认最后有个\0,因此sizeof("xxxx")应该是4,而strlen应该是3.
*/