sizeof和strlen的区别(其中涉及NUL的讲解)

来源:互联网 发布:linux 删除svn信息 编辑:程序博客网 时间:2024/05/17 03:17

本文是自己结合平时所学的知识,对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)可以用来定义数组位数的原因①。

注①:因为数组在定义前必须是固定的,所以在C语言中用变量作为数组的大小是不行的

例:

int a=20;

char array[a];//编译器报错,这是错误的

char array[sizeof(a)];//这是可以的


二、从功能上来讲 

1.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小。

2.sizeof后如果是类型必须加括号,如果是变量名可以不加括号。这是因为sizeof是个操作符而不是函数。

 3.当使用一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。

Sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。

4.sizeof操作符不能用于函数类型,不完全类型或位字段。

(不完全类型指具有未知存储大小数据的数据类型,如未知存储大小的数组类型,未知内容的结构或联合类型,void类型等。)

三、从它们的实现上来讲(如有错误,请批评指正)

strlen是遇到0退出,注意:0和 '0' 不同(涉及NUL的解释,请看下面关于的NUL的解释)

而sizeof则是考虑数组的实际所占的存储空间,在程序编译期已被确定下来了

 

易错点及误区:

很多人都会有个潜意识:对同一数组操作,strlen的返回值肯定比sizeof的返回值小1,(很显然,这是错的,请看下面的例子)具体的解释看程序分析

 

附源码:

<span style="font-size:18px;">#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;}</span>


程序的运行结果:

NUl的定义

C语言中规定以字符‘\0'作为字符串结束标志。’\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”,

它不引起任何控制动作,也不是一个可显示的字符

 

对于程序的分析:

strlen是遇到0(及NUL)退出,上面的程序中strlen函数在遇到0时及数组中第四个元素时即退出了,故而返回的是值3

而sizeof则是考虑数组的实际所占的存储空间,在编译器编译期间已经定下来了,数组的实际的所占的存储的空间是5个字节,故而程序打印出5