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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值