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));