作者 | Lee
对于sizeof()和strlen(),很多初学C语言的同学会搞乱掉,这里就来给大家详细的总结下,什么时候该用sizeof(),什么时候该用strlen(),以及在面试的时候,会遇到哪些陷阱。
以下程序均在 32 位操作系统上运行!
sizeof()
1、sizeof()用于计算数据类型的长度
常见的用法有:
sizeof()加上普通数据类型
sizeof(int); //结果是4sizeof(char); //结果为1
sizeof()加上数组
char a[5] = {0};sizeof(a); //结果为5int b[5] = {0};sizeof(b); //结果为 4 * 5 = 20char c[] = {1, 2, (3, 4), 5};sizeof(c); //结果为4
sizeof()加上数组元素
int a[5] = {0};sizeof(a[1]); //结果为4
sizeof()加上指针(地址)
sizeof(int *); //结果为8int a;sizeof(&a); //结果为8char b[5] = {0};sizeof(&b); //结果为8
sizeof()加上奇怪的东西
int a[] = {1, 2, 3, 4};sizeof(*a); //结果为4sizeof(*&a); //结果为20/*注意*/sizeof(a + 1); //结果为4int b[2][3] = {{1, 2, 3}, {4, 5, 6}};sizeof(b[0]); //结果为12sizeof(b[0] + 1); //结果为4sizeof(&b[0]); //结果为4sizeof(*(b[0] + 1)); //结果为4
sizeof()需要计算出表达式的类型,分为数组、指针、普通类型三种,如果是指针的话,不管是几级地址,结果都是4(32位操作系统)。
2、sizeof()是关键字,不是函数
如何证明?
#include int main(){ int a = 1; printf("%lu\n", sizeof(a++)); printf("%d\n", a); return 0;}
结果:
root@turbo:~# ./test 41root@turbo:~#
如果sizeof()是函数,在执行函数之前,会先算出参数的结果。但是从结果可以看出,参数a的值并没有变,所以sizeof()不是函数,只是C语言中的一个关键字。
strlen()
strlen()用于计算字符串长度,参数是字符串的首地址。strlen()函数遇到字符'\0'结束,所以要求字符串必须是合法的字符串,以'\0'结束。
1、用字符串常量作参数
strlen("helloworld"); //结果为10
2、用指针作参数
char *s = "helloworld";strlen(s); //结果为10
3、用数组名作参数
char str[] = "helloworld";strlen(str); //结果为10char s[5] = {'a', 'b', 'c', 'd', 'e'};strlen(s); //随机值(字符串没有'\0')int num[] = {1, 2, 3, 4, 5};strlen((char *)num); //随机值(取决于数组里面的数值)char n[] = {1, 2, 3, 4, 5};strlen(n); //随机值(字符串没有'\0')/*以上两种情况虽然是数字,也可以计算长度,原则就是遇到'\0'即一个字节全是0结束*/char m[5] = {1, 2, 3};strlen(m); //结果为3
4、用奇怪的东西作参数
char arr[2][3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};strlen((char *)arr); //随机值(没有遇到'\0')char arr[2][3] = {{'a', 'b'}, {'d', 'e', 'f'}};strlen((char *)arr); //结果为2char arr[2][4] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};strlen(arr[0]); //结果为3
以上基本上涵盖了sizeof()和strlen()的所有内容。笔试题千变万化,但是万变不离其中,sizeof()需要计算数参数的类型,strlen()需要根据地址找到字符串所在内存,遇到'\0'结束,掌握这两个原则,就不会出什么问题。