Sizeof与Strlen的区别与联系
2013-11-02 21:22
211 查看
【几个例子】
例子1:char* ss = "0123456789"; sizeof(ss) //4, ss是指向字符串常量的字符指针 strlen(ss) //10, 只能用它获得这个字符串的长度 char ss[] = "0123456789"; sizeof(ss) //11, ss是数组,计算到‘\0’位置,因此是10+1 strlen(ss) //10, strlen是个函数内部实现是用一个循环计算到\0为止之前 char ss[100] = "0123456789"; sizeof(ss) //100, ss表示在内存中的大小100×1 strlen(ss) //10, strlen是个函数内部实现是用一个循环计算到\0为止之前 int ss[100] = "0123456789"; sizeof(ss) //400, ss表示再内存中的大小100×4 strlen(ss) //错误, strlen的参数只能是char* 且必须是以‘\0‘结尾
例子2:
class X { int i; int j; char k; }; X x; cout<<sizeof(X)<<endl; 结果 12 内存补齐 cout<<sizeof(x)<<endl; 结果 12 同上
例子3:
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小),即如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
【sizeof与strlen区别总结】
1.sizeof是运算符,strlen是函数。
2. strlen是有效字符串的长度,不包含‘\0’,与初始化有关系,而sizeof与初不初始化没有关系
3.sizeof可以用类型做参数,用来计算类型占内存大小,strlen只能用char*做参数,且必须是以'\0'结尾的,用来计算字符串的长度;
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5. sizeof在编译时计算,而strlen的结果在运行时才能计算出来,
【课堂测试】
1. 如下程序的输出是什么?(在intel x86(32-bit) platform.)
#include <stdio.h> #include<stdlib.h> #include<string.h> int main( ) { char str[10]; char *p; memset(str,0x00,sizeof(str)); p = (char *)malloc(100); printf("%d\n",sizeof(p)); printf("%d\n",sizeof('p')); printf("%d\n",strlen(str)); exit(0); }
答:4/1/0, 如果不加memset(),第三行就会打出15(随机数),请问这是为什么?memset函数是初始化分配的内存空间,使用0、0x00都是0即’\0',不同系统当分配一块内存时,这块内存中的内容是未知的,系统只是根据申请者的要求为其化一块内存并不管他原先的内容是什么(有的系统清零),所以你的是随即数15。
2.你能够正确的说出它们的sizeof和strlen的大小吗?
#include<stdlib.h>
#include<string.h> #include<stdio.h>
int main( ) { char *str1="absde"; char str2[]="absde"; char str3[8]={'a',}; char str4[8]={'a','b','s','e','f','g','h','j'}; printf("sizeof(str1)=%d\n",sizeof(str1)); printf("sizeof(str2)=%d\n",sizeof(str2)); printf("sizeof(str3)=%d\n",sizeof(str3)); printf("sizeof(str4)=%d\n",sizeof(str4)); printf("strlen(str1)=%d\n",strlen(str1)); printf("strlen(str2)=%d\n",strlen(str2)); printf("strlen(str3)=%d\n",strlen(str3)); printf("strlen(str4)=%d\n",strlen(str4)); exit(0); }
答:sizeof是计算括号中变量的类型所占的储存空间(不考虑内容);strlen是计算变量值为起点的内存地址到第一个'\0'的距离,以字节为单位,字符串尾部为'\0',0=='\0'(不包括’\0’)。正确答案是:4、6、8、8;5、5、1、9;
3. 你能够正确的说出它们的sizeof和strlen的大小吗?
char *str1="absde"; char str2[]="absde"; char str3[8]={'a',}; char str4[8]={'a','b','s','e','f','g','h','j'}; 答案: sizeof(str1)=4; sizeof(*str1)=1; strlen(str1)=5; sizeof(str2)=6; strlen(str2)=5; sizeof(str3)=8; strlen(str3)=1; sizeof(str4)=8; strlen(str4)=13; strlen(*str1) 出错
strlen(str4)有可能为不小于8的其他数字,取决于内存中的数据,因为strlen是计算变量值为起点的内存地址到第一个'\0'的距离,但'\0'出现位置我们是未知的。
相关文章推荐
- Sizeof与Strlen的区别与联系
- sizeof 详解 及其与 strlen 不同区别与联系
- Sizeof与Strlen的区别与联系(转)
- Sizeof与Strlen的区别与联系(转)
- Sizeof与Strlen的区别与联系
- C语言中sizeof和strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系 数组名作函数形参
- sizeof()和strlen()的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系