Sizeof()与strlen()的区别

sizeof()用于查看变量 所占的空间。例如:

sizeof(int) // 4

sizeof(float)// 4

sizeof(double)//8

sizeof(char) //1

char * p = new char[20];sizeof(p)//这里是p指针所占的空间故为4

char * p = “google”;sizeof(p);//这里是p指针指向字符串常量,但sizeof()的结果仍然为4

char *p [20];//这时sizeof()为80 = 20 × 4

char p[20];sizeof(p);//这里的结果为20 = 20 × 1

sizeof()使用了编译器生成的符号表的缘故。编译器的符号表类似于下面的形式,将所有的变量和其类型都记录在表中。

变量                  类型             大小

p                        char             10----------(数组)

a                        char              1

b                       double          8

d                       point              4

当要sizeof(变量)时,sizeof就会查取符号表。如果是单一类型的变量就会直接输出此类型变量的所占大小。并且也可以同时知道这个变量是否是数组。

但是Class类型稍稍有些不同,以下代码:

class A
{
public:
int a;
int b;
private:
int c;
protected:
char d;
double x;
};

sizeof(A)//24.为什么不是 3*4+1+8 = 21? 因为编译器要做优化,所以采用的是4Byte一体,也就符合我们常说的32位机的原理。也就是
机器的cpu可以同时处理32位二进制。所以地址线也做成了32位方便传输。编译器就将A优化为24Byte.但这只是对于32位机器有效。Vista等支持64位机
器。所以以后的VS2008等高级版本可能要将这个优化为可以被8B整除的字节数。

在字符表中,编译器大概会如此存储:类名  分隔符  变量名,这样即保证变量不会重名,又可以知道是那个类中的变量。

A::a      int         4

A::b      int         4

A::c       int         4

A::d      char      1

A::x      double   8

当调用sizeof(A)的时候,编译器会去寻找A类的所有变量,相加后如果不能被4整除,将变为最接近的4的倍数。

strlen()用于返回字符串的长度。但是不包括最后的’/0’

char * p = “google”; strlen(p);//结果为6

char * p = new char [20];
strlen(p)//???这里结果不能确定,原因是不知道何处有’/0’,strlen是查找到’/0’结束

strlen()函数的大概写法:

int strlen(const char * strSrc)
{
if(strSrc == NULL)
throw “NULL point…”;
int i = 0;
while(*strSrc++!=‘/0’)
i++;
return i;
}