sizeof和strlen的区别(其中涉及NUL的讲解)
2012-12-09 00:27
176 查看
本文是自己结合平时所学的知识,对sizeof和strlen的区别进行了总结,如有不对的地方还请批评指证,共同进步!!!
一、从C语言的定义上来讲
1、sizeof是关键字,而strlen是包含在string.h头文件中的一个字符串函数
2.sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型,该类型保证能容纳实现所建立的最大对象的字节大小。
而string函数的返回类型是整形,返回的是字符串的起始到第一个‘NUL’的所占字节的个数
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
4.大部分编译程序在编译的时候就把sizeof计算过了(所以sizeof的值是常量,不能出现在表达式的左边),是类型或是变量的长度,这就是sizeof(x)可以用来定义数组位数的原因。
二、从功能上来讲
1.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
2.sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是函数。
3.当使用一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。
Sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。
4.sizeof操作符不能用于函数类型,不完全类型或位字段。
(不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型,未知内容的结构或联合类型,void类型等。)
三、从它们的实现上来讲(自己推导的,估计是这样,如有错误,请批评指正)
strlen是遇到0退出,注意:0和 '0' 不同(涉及NUL的解释,请看下面关于的NUL的解释)
而sizeof则是考虑数组的实际所占的存储空间,在程序编译期已被确定下来了
易错点及误区:
很多人都会有个潜意识:对同一数组操作,strlen的返回值肯定比sizeof的返回值小1,(很显然,这是错的,请看下面的例子)具体的解释看程序分析
附源码:
程序的运行结果:
NUl的定义
C语言中规定以字符‘\0'作为字符串结束标志。’\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”,
它不引起任何控制动作,也不是一个可显示的字符
对于程序的分析:
strlen是遇到0(及NUL)退出,上面的程序中strlen函数在遇到0时及数组中第四个元素时即退出了,故而返回的是值3
而sizeof则是考虑数组的实际所占的存储空间,在编译器编译期间已经定下来了,数组的实际的所占的存储的空间是5个字节,故而程序打印出5
一、从C语言的定义上来讲
1、sizeof是关键字,而strlen是包含在string.h头文件中的一个字符串函数
2.sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsigned int 类型,该类型保证能容纳实现所建立的最大对象的字节大小。
而string函数的返回类型是整形,返回的是字符串的起始到第一个‘NUL’的所占字节的个数
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。
4.大部分编译程序在编译的时候就把sizeof计算过了(所以sizeof的值是常量,不能出现在表达式的左边),是类型或是变量的长度,这就是sizeof(x)可以用来定义数组位数的原因。
二、从功能上来讲
1.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。
2.sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是函数。
3.当使用一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。
Sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。
4.sizeof操作符不能用于函数类型,不完全类型或位字段。
(不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型,未知内容的结构或联合类型,void类型等。)
三、从它们的实现上来讲(自己推导的,估计是这样,如有错误,请批评指正)
strlen是遇到0退出,注意:0和 '0' 不同(涉及NUL的解释,请看下面关于的NUL的解释)
而sizeof则是考虑数组的实际所占的存储空间,在程序编译期已被确定下来了
易错点及误区:
很多人都会有个潜意识:对同一数组操作,strlen的返回值肯定比sizeof的返回值小1,(很显然,这是错的,请看下面的例子)具体的解释看程序分析
附源码:
#include <stdio.h> #include <string.h> int main() { char a[]={'0','1','2',0,'3'}; printf("the size is :%d\n",sizeof(a)); printf("the size is :%d\n",strlen(a)); return 0; }
程序的运行结果:
NUl的定义
C语言中规定以字符‘\0'作为字符串结束标志。’\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”,
它不引起任何控制动作,也不是一个可显示的字符
对于程序的分析:
strlen是遇到0(及NUL)退出,上面的程序中strlen函数在遇到0时及数组中第四个元素时即退出了,故而返回的是值3
而sizeof则是考虑数组的实际所占的存储空间,在编译器编译期间已经定下来了,数组的实际的所占的存储的空间是5个字节,故而程序打印出5
相关文章推荐
- sizeof和strlen的区别(其中涉及NUL的讲解)
- strlen和sizeof函数区别(深入理解)
- C/C++学习之strlen与sizeof区别、阿里巴巴笔试题实例
- sizeof和strlen的区别
- Sizeof与Strlen的区别与联系(转)
- strlen和sizeof的区别
- sizeof与strlen的区别
- strlen和sizeof函数区别(深入理解)
- sizeof和strlen的区别
- sizeof与strlen的区别
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别与联系
- C数组名与指针,sizeof与strlen,free与delete区别,野指针,编译过程简介
- C/C++ sizeof与Strlen的区别与联系
- sizeof和strlen的区别
- char *p 和 cha'r p[10]的区别/sizeof和strlen的区别
- sizeof() 与 strlen()的区别
- Sizeof与Strlen的区别与联系
- Sizeof与Strlen的区别
- Sizeof与Strlen的区别与联系