江苏水利工程建设招投标网站,用手机制作动画的app,公司字号大全,如何快速自己做网站大家都知道#xff0c;在c中算字符串长度和所占空间大小事不可避免的#xff0c;甚至再有的时候#xff0c;我们在写代码的过程中#xff0c;就会用到这些数据。比如#xff0c;下面这道题 struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];…大家都知道在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(a0)); //4/8
printf(%d\n,sizeof(*a)); //4
printf(%d\n,sizeof(a1)); //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(a1)); //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的讲解如果对你们有用的话希望大家点一下支持吧