sizeof和strlen在C语言中常用来计算字符大小和长度,在应用中却有着本质的区别。
sizeof是C语言中的关键字,其作用是返回一个对象或类型所占的内存字节数。使用方式为:
int i; sizeof(int); *//值为4*` sizeof(i); *//值为4,等价于sizeof(int)* sizeof(2); *//值为4,等价于sizeof(int),因为2的类型为int* sizeof(2 + 3.14); *//值为8,等价于sizeof(double),因为此表达式的结果的类型为double*
strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0
,然后返回计时器的值。最终统计的字符串长度不包括\0
。使用方式为:
char str[30] = "abc defg"; // printf("strlen(str) = %d \n", strlen(str)); // 带上空格总共8字符
上述为sizeof关键字和strlen函数的基本用法,在实际应用或面试中,应多注意两者区别:
1、sizeof关键字在编译时期就已经确定,stelen函数在运行时期确定。
int a = 1; printf("%d", sizeof(a++)); printf("%d", a);
上述代码运行结果为4,1。因为sizeof是关键字,所以在第一行输出时a++不会运行,括号内的参数并不会参与计算。这也正证实sizeof关键字在编译时期已经确定,系统认为是常数。
其实上述代码也可作为分辨关键字和函数的区别,当然用指针取址的方法也可分别关键字和函数的区别。
int b = 10; void* a = &sizeof(b);
这行代码会运行错误,如果sizeof为函数,则指针可指向sizeof的地址,但因为是关键字,取址会导致编译错误。
2、sizeof和strlen的结束符占有大小不同。
sizeof("\0") = 2; strlen("\0") = 0;
strlen是计算字符串的长度,在C/C++中字符串以“\0”结尾。
sizeof计算操作数的存储大小,“\0”占两字节。
3、strlen返回值为size_t,为无符号整型。
char a[10] = "abcd"; char b[10] = "a"; if (strlen(b) - strlen(a) > 0) { printf("字符串b 比 字符串a 长 \n"); } else { printf("字符串a 比 字符串b 长 \n"); }
上述代表运行结果为“字符串b比 字符串a 长 ”,导致这个输出结果的原因为size_t为无符号整型,所以strlen(b)结果为大于0的数,strlen(a)结果为大于0的数,两个size_t相减也为size_t类型,结果也一定大于0.
4、strlen()定义字符串数组时,一定要初始化。
char test[50]; // 未初始化 printf(" test[] = "); for (int i = 0; i < 26; i++) { test[i] = 'A' + i; printf(" %c ", test[i]); } printf("\n stelen(test) = %d \r\n", strlen(test));
上述看到strlen计算出的结果是77,显示是错误的
原因:test字符串在定义时未初始化,test字符串在定义时,拿到一片内存,此时这片内存里面可能储存有值,导致使用strlen计算test字符串时找不到字符串结束标志 ’\0‘,而会在test申请的那片内存后面一直找下去,找到 ’\0‘ 后输出,计算的结果,此时输出的结果肯定错误的结果。
以上为网上资料和个人的一些理解,如有错误,请指正。
资料出处
https://blog.csdn.net/qq_45809384/article/details/124705939
https://blog.csdn.net/u013812502/article/details/81198452