sizeof 与 strlen的区别

1.sizeof

1.1 当使用了一个结果类型或变量时,sizeof 返回实际的大小。当使用一静态的空间数据时,sizeof返回全部数组的尺寸。

sizeof操作符不能返回被动态分配的数据或外部的数组的尺寸

1.2 大部分编译程序在编译的时候就把sizeof 计算过了,是类型或则变量的长度,所以sizeof(x)可以定义数组的维数
char str[20];
int b=sizeof(str);
int a[b];

2.strlen

2.1. strlen的参数只能是 char *,且必须是以’\0‘结尾的

2.2. strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型占内存的大小

需要特别注意的是,函数 strlen 返回的是一个类型为 size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:

/*判断一*/
if(strlen(x)>= strlen(y))
{
}
/*判断二*/
if(strlen(x)- strlen(y)>= 0)
{
}

从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?

原因很简单,因为函数 strlen 的返回结果是 size_t 类型(即无符号整型),而 size_t 类型绝不可能是负的。因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。

同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:

/*判断一*/
if(strlen(x)>= 5)
{
}
/*判断二*/
if(strlen(x)- 5>=0)
{
}

很显然,判断表达式二的结果还是永远是真,其原因与上面相同。

例子:

char *q3 ="a\n";
sizeof(q3)为4,指针的大小就是一个定值,就是4
strlen(q3) 为2

char ss1[]= "0123"
sizof(ss1) 为5,因为包含‘\0‘
strlen(ss1) 为4

char ss2[]={'6','0','2','3'};
sizof(ss2) 为4
strlen(ss2) 为4

char ss3[100]="0123";
sizeof(ss3) 为100
strlen(ss3) 结果为4,它的内部是一个循环计算字符串的长度,直到’\0‘为止

int ss4[100];
sizeof(ss4) 为400,因为int占4个字节
strlen(ss4) 错误,strlen的参数只能是 char *,且必须是以’\0‘ 结尾的

char str[20];
strlen(str) 得到的值错误,因为要 strlen 要以’\0‘结尾
char str[2]="23";
strlen(str) 得到的值错误,因为要 strlen 要以’\0‘结尾,这里数组定义太小了

sizeof 计算栈中分配的大小,其他区域是不会计算在内的
class A
{
    public:
    int a;
    static int b;
}
sizeof(A1) 为4, 因为静态变量存放在全局数据区

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值