> 文章列表 > sizeof以及strlen的用法以及注意事项

sizeof以及strlen的用法以及注意事项

sizeof以及strlen的用法以及注意事项

大家都知道,在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));       //6printf("%d\\n", strlen(arr + 0));   //6printf("%d\\n", strlen(*arr));      //错误printf("%d\\n", strlen(arr[1]));    //错误printf("%d\\n", strlen(&arr));      //6printf("%d\\n", strlen(&arr + 1));  //随机值printf("%d\\n", strlen(&arr[0] + 1));// 5

 上面说过,strlen 接收的是地址,所以不是地址的会出错,而strlen是以'\\0'截止,就是碰到'\\0'就会停止计算,所以,倒数第而个是因为他指向了整个数组的后面,我们不知道他什么时候有'\\0',所以是随机值。

以上就是我对sizeof和strlen的讲解,如果对你们有用的话,希望大家点一下支持吧!!!