大家都知道,在c中算字符串长度和所占空间大小事不可避免的,甚至再有的时候,我们在写代码的过程中,就会用到这些数据。比如,下面这道题
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
像这道题就是要算出结构体的字节数,才能完美的答出这道题的答案。结构体中存在对齐问题,不过也可以直接用sizeof来计算,结构体所占字节数是20.因为%p十一地址形式打印出来,所以他的答案就是0x00100014,0x00100001,0x00100004,下面是打印的结果
所以,我们一定要掌握好sizeof和strlen
注意事项:
sizeof:
1.首先要谨记,sizeof是操作符,不是函数。
2.在用sizeof运算时,sizeof括号中的表达式不参与计算,换句话说,他在乎的只是类型
strlen:
1.strlen所接收的参数是地址,如果给其传参传的不是地址,则会报错
下面来看看sizeof和strlen的实际计算
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a)); //16
printf("%d\n",sizeof(a+0)); //4/8
printf("%d\n",sizeof(*a)); //4
printf("%d\n",sizeof(a+1)); //4/8
printf("%d\n",sizeof(a[1])); //4
printf("%d\n",sizeof(&a)); //4/8
printf("%d\n",sizeof(*&a)); //16
printf("%d\n",sizeof(&a+1)); //4/8
printf("%d\n",sizeof(&a[0])); //4/8
printf("%d\n",sizeof(&a[0]+1)) //4/8
sizeof计算的是地址,在32位环境下是4,在64位环境下是8,而sizeof算的是数组名时,那么此时他计算的是整个数组的字节数,下面是打印结果(32位):
下面是64位:
再来看看strlen:
char arr[] = "abcdef";
printf("%d\n", strlen(arr)); //6
printf("%d\n", strlen(arr + 0)); //6
printf("%d\n", strlen(*arr)); //错误
printf("%d\n", strlen(arr[1])); //错误
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr + 1)); //随机值
printf("%d\n", strlen(&arr[0] + 1));// 5
上面说过,strlen 接收的是地址,所以不是地址的会出错,而strlen是以'\0'截止,就是碰到'\0'就会停止计算,所以,倒数第而个是因为他指向了整个数组的后面,我们不知道他什么时候有'\0',所以是随机值。
以上就是我对sizeof和strlen的讲解,如果对你们有用的话,希望大家点一下支持吧!!!