sizeof 和 strlen 有以下区别:
sizeof 是一个操作符,strlen 是库函数。
sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为‘\ 0‘的字符串作参数。
编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof
计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。
数组做 sizeof 的参数不退化,传递给 strlen 就退化为指针了。
int _tmain(int argc, _TCHAR* argv[])
{
//strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',
// 如果你只定义没有给它赋初值,这个结果是不定的
// 它会从aa首地址一直找下去,直到遇到'\0'停止
//而sizeof()返回的是变量声明后所占的内存数,不是实际长度,
//此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
char aa[10];
std::cout << strlen(aa) << endl; //结果是不定的
char bb[10]={'\0'};
std::cout << strlen(bb) << endl; //结果为0
char cc[10] = "hui";
std::cout << strlen(cc) << endl; //结果为3
char *s="Golden Global View";
std::cout << strlen(s) << endl; // 18
std::cout << sizeof(aa) << endl; // 10
std::cout << sizeof(bb) << endl; // 10
std::cout << sizeof(cc) << endl; // 10
std::cout << sizeof(s) << endl; // 4
//大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度 这就是sizeof(x)可以用来定义数组维数的原因
char* ee = "0123456789";
std::cout << sizeof(ee) << endl; //结果 4 ===》ee是指向字符串常量的字符指针
std::cout << sizeof(*ee) << endl; //结果 1 ===》*ee是第一个字符
char str[20]="0123456789";
std::cout << strlen(str) << endl; //10
std::cout << sizeof(str) << endl; //20
char ff[] = "0123456789";
std::cout << sizeof(ff) << endl; //结果 11 ===》ff是数组,计算到\0位置,因此是10+1
std::cout << sizeof(*ff) << endl; //结果 1 ===》*ff是第一个字符
char gg[100] = "0123456789";
std::cout << sizeof(gg) << endl; //结果是100 ===》gg表示在内存中的大小 100×1
std::cout << strlen(gg) << endl; //结果是10 ===》strlen是个函数,内部实现是用一个循环计算到\0之前为止
int hh[100] = {0,1,2,3,4,5,6,7,8,9};
std::cout << sizeof(hh) << endl; //结果 400 ===》hh表示在内存中的大小 100×4
//std::cout << strlen(hh) << endl; //错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
char q[]="abc";
char p[]="abc\n";
std::cout << sizeof(q) << endl; // 4
std::cout << sizeof(p) << endl; // 5
std::cout << strlen(q) << endl; // 3
std::cout << strlen(p) << endl; // 4
class X
{int i; int j; char k; };
X x;
cout<<sizeof(X)<<endl; //结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; //结果 12 同上
cin.get();
}
来源:oschina
链接:https://my.oschina.net/u/1867627/blog/758351