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;
}