strlen 与 sizeof 区别

1.函数类型

#include <string.h>

size_t strlen(const char *s);

size_t sizeof()

2.本质区别

本质上,strlen是函数,而sizeof是运算符。strlen需要进行一次函数调用,而对于sizeof而言,因为缓冲区已经用已知字符串进行了初始化,起长度是固定的,所以sizeof在编译时计算缓冲区的长度,sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧;strlen()在运行时通过函数调用计算字符串的值。

3.引申区别

1). strlen计算不包含终止null字节的字符串长度,而sizeof则计算包括终止null字节的缓冲区长度。

2). strlen只能用char*做参数,且必须是以'\0'结尾的。sizeof可以用类型做参数,还可以用函数做参数。数组传递给strlen就退化为指针了,传递给sizeof的参数不退化。  

3). 当适用了于一个结构类型时或变量,sizeof返回实际的大小;当适用一静态地空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸  

4). 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:   
fun(char []) 都等价于fun(char *)

在C/C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:  

   fun(const char *s, int len)

   {  

        char* buf [len+1];  //编译无法通过,应改为: char *buf = new char[len+1];  Added by Armstrong@2010.07.22

        memcpy(buf, s, len);

   }

   5). Sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型是指具有未知存储大小的数据数据类型,如未知存储大小的数组类型,void类型等。

4.sizeof另解

程序存储分布有三个区域:栈、静态和动态。所有能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针间接操作的。sizeof 操作符,计算的是对象在上的投影体积;除了栈上的char数组这一个特殊情况之外。。。

sizeof计算的都是类型的长度。如果是对象,则转换成类型,再计算类型的长度。

在32位系统中。指针类型是32位,4个字节。所以对任何指针用sizeof结果都是4;  

    1). 数组用sizeof = 数组的步长(类型的长度)*数组的长度。  

    2). 复合结构sizeof= 各个数据成员的类型长度*声明的个数之和。(要考虑到字节对齐)  

    typedef struct student

    {

        int data;

        static int number;

    } node1;

    typedef struct teacher

    {

        int data;

        char name;

    } node2;

    sizeof(node1)=4个字节。//静态变量是放在全局数据区,sizeof计算栈分配的大小,不会计算静态变量的。

    sizeof(node2)=8个字节。//字节对齐

    3). 引用用 sizeof 。 如果引用的是对象,则先转化成引用的对象类型。如果是复合类型。则用2。否则直接计算。


实例:

#include <stdio.h>
#include <string.h>
 
int main(){
    char  str []="fuckyou";
    double a[]={1.0,2.3,4.5};
    double  * p;
    char *t;
    t=str;
    p=a;
    printf("%d,%d\n",strlen(str),sizeof(str)); // 结果:7 8
    printf("%d,%d\n",strlen(a),sizeof(a));  // 结果:不定 24 
    printf("%d,%d\n",sizeof(*t),sizeof(t));   // 结果:1 4 *t为char    t为char * 任何指针在32机器上都是4字节 
    printf("%d,%d\n",sizeof(*p),sizeof(p));   // 结果:8 4 
    getchar();
    return 0;   
    } 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值