在计算时,从字符串的首地址开始搜索字符串结束符‘\0’,返回的值不包括结束的字符‘\0’。
其中当s为字符数组时,也是搜索字符串结束符,所以一些情况要手工添加‘\0’
例如:
char b[] = "abcde";
char aa[6];
memcpy(aa,b,5);
aa[5] = 0; // 必须手工指定终结符
int bLen = sizeof(b); // 6
int aaLen = sizeof(aa);// 6
int bL = lstrlen(b); // 5
int aaL = lstrlen(aa); // 5
2.sizeof()为计算实际分配来多少的内存空间,当为字符串是,需要算上结尾的‘\0’
例如:
char buffer[] = "this";
sizeof(buffer) = 5;
strlen(buffer) = 4;
注意当sizeof()中为字符指针的时候,不能返回值是指针的长度为4.
一般来说字符数组和字符类型的指针可以相互转换,字符数组作参数的时候会退化为字符指针,但是有些情况例外:
用作sizeof()时候
char *a="abcde"
strlen(a) // 5
sizeof(a) // 4 a是一个指针啊 指针都是4byte大
一些帮助理解的小例子
1.
char s[]=“abc\0ch” ; sizeof(s)=7 sizeof是获得变量s所占的内存的大小,当数组不给出元素个数值时,按初始化的数据所占空间的大小确定。“abc\0ch”计有6个字符,字符串尾会自动补一个\0,因此,s占内存空间为7个字节。 strlen(s) =3 函数strlen(s)是从s地址开始统计,遇到\0时结束,返回统计到的字符个数 2. sizeof()返回的长度包括'\0'吗? sizeof无关\0你申请多长就是多长,另外如果是字符串的话,你申请的长度是包括字符串结束符的,所以从这个方面理解,包括‘\0’. 3. char a[5]={'a','b','c','d','e'} 不能把它看成一个正常的字符串,只能当成字符数组,不能用作strlen操作,但是可以sizeof()值是5. 4. char *b="abcde";那b可以直接拷贝到一个char a[5]这样的数组中吗? 不能拷贝,因为字符串b需要6个内存单元,末尾有自动添加的字符串结束符。 char a[5]; char b[] = "abcde"; lstrcpy(a,b); // ok 不用指定终结符 char aa[6]; memcpy(aa,b,5); aa[5] = 0; // 必须手工指定终结符 int aLen = sizeof(a); // 5 int bLen = sizeof(b); // 6 int aaLen = sizeof(aa);// 6 int aL = lstrlen(a); // 5 int bL = lstrlen(b); // 5 int aaL = lstrlen(aa); // 5 要注意memcpy与lstrcpy的区别 5. 用运算符sizeof 可以计算出数组的容量(字节数)。实例一sizeof(a) 的值是12(注意别忘了’\ 0 ’)。指针p 指向a,但是sizeof(p)的值却是4 。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p 所指的内 存容量。C++/C 语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。当内存已经申请的时候,可以直接返回申请的内存的数量,这个时候不会退化为指针 实例二注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。示例 二,不论数组a 的容量是多少,sizeof(a)始终等于sizeof(char *)。 char a[ ] ="hello world"; char *p =a; cout<<sizeof(a)<<endl;//12 字节 cout<<sizeof(p)<<endl;//4 字节 实例一计算数组和指针的内存容量 void Func(char a[ 100] )//当字符数组作函数的参数时,会蜕变为指针。 { cout<<sizeof(a)<<endl;//4 字节而不是100 字节 } 实例二b数组退化为指针,也可以理解为此时char并没有实际分配内存,所以无法获得他指定内存的容量。 但是char a[3];此时分配内存空间 sizeof(a)值为3.此时分配来三个内存单元。 char a={"acb\0de"},此时sizeof(a)为7,因为分配来7个内存空间,忽略'\0'. char a[10]={"sdfcdc"}; char b[10]={'a','b','c','d'}; char d[]={"abcd"}; char e[]={'a','b','c','d'}; 则sizeof(a)=10;sizeof(b)=10;sizeof(c)=5,sizeof(d)=4.
6.关键是
区分字符数组和字符串两个概念:
1
字符数组不考虑其中有没有'\0'
字符串操作借用字符数组,并规定字符'\0'为串结束标志。
2
定义字符数组并指定大小,如char a[5],此时系统作字符数组处理,size=5;
如果不指定大小,如char a[]="xxx";,或者char*p="xxx";,此时系统作字符串处理,自动在末尾加'\0',size比字符数多1。
需要注意的是:对于char a[5];
其一,strlen(a)返回的值是不确定的,取决于相关内存中的不确定值;
其二,鉴于内存分配的字符对齐方式,所以在做了strcpy(a,"abcdefg");之后,不一定就会出错,因为a后面可能就有几个系统留下的空间。
3
区分内存操作与串操作的不同,串操作要检查'\0'的存在,或自动设置'\0'。