sizeof与strlen的区别

sizeof用法:sizeof();
strlen 用法 :size_t strlen(const char *s);
我们先看几个例子:
例1
char* ss = "01234";
sizoef(ss) 结果为4,ss是指向指向字符串常量的字符指针.
sizeof(*ss) 结果为1,*ss是第一个字符.
例2
char ss[ ] = "01234";
sizeof(ss) 结果为6,ss是数组,计算到"\0",所以为5+1.
sizeof(*ss) 结果为1,*ss是第一个字符.
例3
char ss[10] = "01234";
sizeof(ss) 结果为10,ss表示在内存中预分配的大小,10*1.
strlen(ss) 结果为5,它是内部实现是用一个循环计算字符串的长度,直到"\0"为止,"\0"不算在内.
例4
int ss[10] = "01234";
sizeof(ss) 结果为40,ss表示在内存中预分配的大小,因为是int类型,所以10*4.
strlen(ss) 错误,因为strlen的参数只能是char*,且必须是以"\0"结尾的。

sizeof与strlen的区别如下:
1、sizeof操作符与strlen的结果类型是size_t,sizeof表示该类型在内存的大小,而strlen用来计算字符串的长度
2、sizeof是运算符,strlen是函数。
3、sizeof可以用类型、函数、数组、指针(指针占内存大小为4个字节)、对象做参数,strlen的参数只能是char*,且必须是以"\0"结尾的,"\0"不计算在内。  
4、当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间组, sizeof 归还全部数组的尺寸,sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
 5、当数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如var(char[8]),var(char [ ]) 都等价于fun(char *).
例如:
char var [10]
int test(char var[ ]){
return sizeof(var)
};//因为var[ ] 等价于*var,已经退化成为一个指针,所以大小是4.
6、unsigned 影响的只是最高位bit的正负,数据长度是不会被影响的。
例如:
sizeof(unsigned int ) == sizeof(int)
7、自定义类型的sizeof取值等同于他的类型原型。
例如:
typedef short word;
sizeof(short) == sizeof(word)
8、数组的大小是各维数的乘积*数组元素的大小。
例如:
char a[3][4] = { };
int b[3][4] = { };
sizeof(a) 为12,strlen 为0 ;
sizeof(b) 为12*4=48,strlen 为0;
9、只要是指针,sizeof大小就是4。
例如:
sizeof(string *) 为4.
10、当计算结构体变量的大小就必须讨论数据对齐的问题。为了使计算机cpu存取的速度更快,cpu每读取一个数据按照4个字节(32位的操作系统)或8个字节(64位的操作系统)进行读取。这样虽然会浪费一些内存,但cpu的处理速度更快。
例如:
class B{
float f;
char p ;
int abc[3];
}
sizeof(B)为20个字节,float f占4个字节,char p 占1个字节, int abc[3]占12个字节,由于要考虑字对齐的原则,char p类型要占4个字节,所以答案为20个字节。
注意 :一个空类占的空间为1,多重继承的空类所占的空间还是1.
例如 :
class A1{
};  //所占空间为1
class A2{
};  //所占空间为1
class B: public A1{
};  //所占空间为1
class C:public A1 , public A2{
};  //所占空间为1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值