看过百度文库关于sizeof和strlen的内容后,将其整理如下:
sizeof()与strlen()的比较:
1.定义:sizeof是一个操作符(编译时就计算出了长度),作用就是返回一个对象或者类型所占的内存字节数。
strlen是一个函数(运行时通过函数调用计算长度),计算字符串的长度,直到碰到第一个字符串结束符'/0'。
2.用法
sizeof有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // sizeof( 类型 ); 例如:sizeof(int)为整型所占的字节数
3) sizeof object; // sizeof 对象;
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
strlen()语法:
size_t strlen( const char *string ) //strlen(字符串)
sizeof()和strlen()的返回值都是size_t(unsigned int)类型。
3.数组做sizeof的参数不退化为指针,传递给strlen就退化为指针了.
如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。
即:int func(char p[100]) //数组退化为指针
{ sizeof(p) = 4; }
C/C++中不能传数组,只能传指针,所以任何数组都会隐式转成指针形式进行操作,所以"类型"还是指针。
4.处理字符串时
参数为字符数组:
char str[20]="012345";
int a=strlen(str)=6; (strlen 计算字符串的长度,以结束符 0x00 为字符串结束。)
int b=sizeof(str)=20; (sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。)
char str[]="012345";
int a=strlen(str)=6; 不包含NULL字符
int b=sizeof(str)=7; 包含NULL字符
本质的区别是:sizeof是对象或类型占用的内存大小,而strlen是字符串的长度。
这里sizeof是数组对象的内存大小(包含null('/0'))。
参数为字符串指针:
char* p = "012345";
sizeof(p)= 4 (p是指向字符串常量的字符指针,sizeof 获得的是指针p所占的空间,是长整型的:4字节)
注意:当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。
strlen(p)= 6 (如果要获得这个字符串的长度,则一定要使用 strlen。)
sizeof(*p)=1 (*p是第一个字符其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位)
5.sizeof(结构体对象)与sizeof(联合体)
struct
{char b; int x;} a;
在某些机器上sizeof(a)=8,而一般sizeof(char)+ sizeof(int)=5。
这是因为编译器在考虑对齐问题(这里假设机器是4字节对齐)时,在结构中插入空位以控制各成员对象的地址对齐。
联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。
补充: 数组什么时候会"退化"?
数组在除了以下2种情况外, 其他时候都要"退化"成指向首元素的指针.
例如:char a[] = "hello";
这2中例外情况是:
(1) sizeof(a)
(2) &a(pointer to array of 6 chars)
除了上述2种情况外,a都会退化成&a[0].