首先 sizeof是操作符,strlen是函数,两者不在同一维度上。
其次 sizeof是操作符,返回一个对象或类型名的长度,不限定类型;strlen是<string.h>中计算C风格字符串长度的函数(只能是C风格字符串,C++的string类的对象都不行)。
再次 单就C风格字符串来看
#include <stdio.h> #include <string.h> #define N 100 int main(void) { char a[] = "abcdefhig"; char b[N] = "abcdefhig"; char *c = a; printf("a: sizeof %d strlen %d\n", sizeof(a), strlen(a)); printf("b: sizeof %d strlen %d\n", sizeof(b), strlen(b)); printf("c: sizeof %d strlen %d\n", sizeof(c), strlen(c)); }
输出
a: sizeof 10 strlen 9 b: sizeof 100 strlen 9 c: sizeof 4 strlen 9
第一行:对于一个C风格字符串的首地址,sizeof返回字符串的长度时,将结尾的‘\0‘字符算作字符串的一部分;strlen则不将‘\0‘字符算在内。
第二行:sizeof返回对象的长度,b的长度为100;而strlen只是计算了‘\0‘字符之前的长度。
第三行:对于一个指向数组首地址的指针,sizeof返回对象包含对象的大小,即指针的大小,4个字节;strlen则还是计算b指向字符串的长度,且不包括结尾的‘\0‘。
此处能看出两者的差异了。
最后,sizeof作为操作符用处更广,可以计算给定对象或类型名的长度,不论是内置类型或者是自定义的类或结构体。对于结构体或类的定义,由于涉及到计算机内存分配中的对齐策略,即对象起始地址的偏移量是4的整数倍,所以sizeof返回的结构体或类的长度,可能和“纸面上”的数值不一样。
原文:http://my.oschina.net/u/2313065/blog/505447