C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
2013-02-27 15:07
721 查看
字符数组的长度计算:必须以终止符’/0'作为边界,但对字符数组赋值时,有两种方式:
1:
定义时用字符初始化
(1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6
上式等价于:
(2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 长度为6
也等价于:
(3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 长度为6
但不等价于:
(4)char chs[] = {'a', 'c', '0', 'z', '3','d'}; // 长度未知,因为数组最后没有结束符'/0'
也不等价于:
(5)char chs[6] = {'a', 'c', '0', 'z', '3','d'}// 长度未知,因为数组最后没有结束符'/0'
其中 :(4)和(5)也是等价的,但不应该在实际应用中出现,因为没有结束符的数组长度未知,容易出现数组越界,致使访问非法内存,造成不可预料的程序错误。
因为字符数组是C 语言的概念,可见,C 语言语法中并未保证 :字符数组的结尾一定有结束符,这就需要程序员自己采取措施,以保证在数组的最后一个元素为 '/0' 。
2: 用字符串对数组进行初始化
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'/0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'/0'存入数组,并以此作为该字符串是否结束的标志。有了'/0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。
例如:
char c[]={'c', ' ','p','r','o','g','r','a','m'};
可写为:
char c[]={"C program"};
或去掉{}写为:
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'/0'。上面的数组c在内存中的实际存放情况为:
C p r o g r a m /0
‘/0'是由C编译系统自动加上的。由于采用了‘/0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
3. sizeof 和 strlen 的区别
1:
定义时用字符初始化
(1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6
上式等价于:
(2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 长度为6
也等价于:
(3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 长度为6
但不等价于:
(4)char chs[] = {'a', 'c', '0', 'z', '3','d'}; // 长度未知,因为数组最后没有结束符'/0'
也不等价于:
(5)char chs[6] = {'a', 'c', '0', 'z', '3','d'}// 长度未知,因为数组最后没有结束符'/0'
其中 :(4)和(5)也是等价的,但不应该在实际应用中出现,因为没有结束符的数组长度未知,容易出现数组越界,致使访问非法内存,造成不可预料的程序错误。
因为字符数组是C 语言的概念,可见,C 语言语法中并未保证 :字符数组的结尾一定有结束符,这就需要程序员自己采取措施,以保证在数组的最后一个元素为 '/0' 。
2: 用字符串对数组进行初始化
在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'/0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符'/0'存入数组,并以此作为该字符串是否结束的标志。有了'/0'标志后,就不必再用字符数组的长度来判断字符串的长度了。
C语言允许用字符串的方式对数组作初始化赋值。
例如:
char c[]={'c', ' ','p','r','o','g','r','a','m'};
可写为:
char c[]={"C program"};
或去掉{}写为:
char c[]="C program";
用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'/0'。上面的数组c在内存中的实际存放情况为:
C p r o g r a m /0
‘/0'是由C编译系统自动加上的。由于采用了‘/0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。
3. sizeof 和 strlen 的区别
strlen只能用char*做参数,且该char数组必须是以''/0''结尾的。
数组做sizeof的参数不退化,传递给strlen就退化为指针了。
详细说明可参见: 百度知道: strlen和sizeof有什么区别?http://zhidao.baidu.com/question/12033577.html
注意:大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 。
所以,sizeof 即使在字符数组没有终止符'/0' 的时候,也能够计算出数组“长度”的原因,但这里的“长度”实际上是:编译器分配给该数组变量的内存大小!
例如:char chs[] = {'a', 'c', '/0', 'z', '3','d'}; // sizeof(chs) = 6; 而strlen(chs) = 2.
相关文章推荐
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
- 计算字符串的长度及sizeof与strlen、gets与scanf、字符数组与字符串
- strlen和sizeof求字符数组长度
- 我的编程学习日志(10)--求字符数组与数字数组的长度(strlen,,size,sizeof)
- C语言中用于计算数组长度的函数 “strlen() ”。
- 字符数组 字符指针 sizeof strlen 的区别
- sizeof(变量名)与strlen(字符数组名)的使用区别
- C语言中用于计算数组长度的函数 “strlen() ”。
- C语言中strlen求字符串长度,求字符数组长度(空字符,数字0,字符0,数组部分初始化)
- C语言中strlen求字符串长度,求字符数组长度(空字符,数字0,字符0,数组部分初始化)
- C语言中strlen()函数和sizeof()函数区别[关于字符串长度]
- 字符串和字符数组的区别以及sizeof和strlen的区别
- 计算字符个数及sizeof 与 strlen 的区别
- 关于strlen 计算未初始化的字符数组长度
- C语言里面获取字符串长度sizeof和strlen的区别
- 我的编程学习日志(10)--求字符数组与数字数组的长度(strlen,,size,sizeof)
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- C语言-Sizeof与Strlen的区别与联系(转)
- C语言中的字符指针与字符数组的一点区别