sizeof与strlen

sizeof 与strlen具体的应用实例

实例1:

int main(){

char arr[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};

printf("%d\n",strlen(arr)); //UB (未定义行为) 即错误的代码
printf("%d\n",strlen(arr+0)); //UB strlen要求的类型是char* ,是以’\0’为结束标志的,arr不存在’\0’
printf("%d\n",strlen(arr));arr得到的是char类型,而strlen要求的是char,原则上这个代码编译出错,但由于C语言是弱类型的语言,把char和char给隐式转换了
printf("%d\n",strlen(arr[1]));arr[1]指的是’b’,但由于是char类型,与char*不相同,同上

}

实例2

int main(){

char arr[]={’‘abcdef’’};

printf("%d\n",sizeof(arr)); 7//sizeof求内存大小,这个大小要包含’\0’;
printf("%d\n",sizeof(arr+0)); 4// arr+0隐式转换为指针char*

指针在32位系统下都是4个字节

printf("%d\n",sizeof(* arr)); 1//数组名表示首地址,解引用得到char 类型,一个字节
printf("%d\n",sizeof(arr[1])); 1//arr[1]->char类型
printf("%d\n",sizeof(&arr)); 4//得到一个数组指针char( * )[7]
printf("%d\n",sizeof(&arr+1)); 4//同上
printf("%d\n",sizeof(&arr[0]+1)); 4//得到的是一个char*
printf("%d\n",strlen(arr)); 6//此处计算字符串长度
printf("%d\n",strlen(arr+0)); 6//同上
printf("%d\n",strlen(* arr));UB arr得到的是一个字符a,char类型,与char不匹配,按理说编译失败,但是C语言是弱类型的语言,进行了隐式转换
printf("%d\n",strlen(arr[1])); 同上
printf("%d\n",strlen(&arr)); 6//得到的是一个char(* )[7],与char * 不匹配,按理说应该编译失败的,&arr碰巧和arr得到的地址值是相同的值,这个结果能算对纯属巧合!
printf("%d\n",strlen(&arr+1)); UB数组指针加一,跳过整个数组,访问后面的非法内存
printf("%d\n",strlen(&arr[0]+1));5//得到的char* 加一跳过一个元素
printf("%d\n",strlen(&arr));

}

实例3

int main(){

char* p=“abcdef”;

printf("%d\n",sizeof§); 4//p是char*
printf("%d\n",sizeof(p+1));4//p+1还是char*
printf("%d\n",sizeof(* p); 1// * p解引用得char
printf("%d\n",sizeof(p[1]));1//char
printf("%d\n",sizeof(&p));4//char******
printf("%d\n",sizeof(&p+1));4//同上
printf("%d\n",sizeof(&p[0]+1));4//得到的是一个char*+1还是char*
printf("%d\n",strlen§);6//p指向的是一个字符串
printf("%d\n",strlen(p+1));5//从p+1的位置上往后找5个元素到’\0’
printf("%d\n",strlen(* p));UB 得到的是char与strlen要求的char*不符合 原则上编译失败
printf("%d\n",strlen(p[1]));同上
printf("%d\n",strlen(*p));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值