C语言基础知识之sizeof

1 基本概念

sizeof是以字节的形式计算出操作数的存储空间的大小 ,一种单目运算符,并不是函数。

2 使用对象

sizeof的使用对象包括具体的数据类型或者变量;不能用于函数类型,不完全类型或位字段,因为不知道其存储空间大小。

3 使用场景

sizeof的返回结果类型是size_t, 在头文件中定义为: typedef unsigned int size_t

1、C正式规定字符类型为1字节。

sizeof(char)          = 1;
sizeof(unsigned char) = 1;
sizeof(signed char)   = 1;

2、C中没有具体规定,大小依赖于实现。

sizeof(int)            = 4;
sizeof(unsigned int)   = 4;
sizeof(short int)      = 2;
sizeof(unsigned short) = 2;
sizeof(long int)       = 4;
sizeof(unsigned long)  = 4;
sizeof(float)          = 4;
sizeof(double)         = 8;
sizeof(long double)    = 12;

3、当操作数是指针时

一般Unix/Linux的指针字节数为4。    
例如: char *p;     sizeof(p) = 4;   sizeof(*p)=1;   //*p取值为char类型 
     int *a = malloc(100);    sizeof(a) = 4;  sizeof(*a)=4;   

4、当操作数具有数组类型时,其结果是数组的总字节数。

例如: char a[5];
      int  b[5];
      sizeof(a) = 5;
      sizeof(b) = 20;

5、当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。

例如: sizeof(8)    = 4;  //自动转化为int类型
      sizeof(8.8)  = 8;  //自动转化为double类型,注意,不是float类型
      sizeof("ab") = 3   //自动转化为数组类型,注意加上了最后的'\n'符

6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。

还是让我们拿例子来说话:
union  u{             //对union来说
      char c;
      double d;
}u;
sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

7、当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。

struct a{             //对struct来说
       char b; 
       double x;
 }a;   
 

四字节对其的情况下,sizeof(a) = 12;
八字节对其时,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节。

4 与strlen区别

strlen是一个函数,用来计算字符串的长度,即元素个数,strlen只能用char *作为参数,不包括‘\0’结束符

举例:

1:

char s[10] = "12345";
int a = strlen(s);        
int b = sizeof(s);       
  • a = 5,因为strlen计算的是字符串的实际长度;b = 10,sizeof计算的是数组分配的空间大小。

2:

char *s = "0123456789";
int i = sizeof(s); 
int j = sizeof(*s); 
int k = strlen(s);
  • i = 4,因为sizeof获得的是一个指针的值所占的地址空间,占4个字节;
    j = 1,这是因为 ss 为第一个字符 ‘0’ 所以占一个字节;
    k = 10,这是因为strlen所获得的是此字符串的实际长度;

3:

char buffer[] = "Hello";
int m = strlen(buffer); 
int n = sizeof(buffer); 
  • m = 5,这是因为strlen测量的是字符串的实际长度;
    n = 6,’\0’也需要占用一个字节,5+1。

4:

char buf[]={'a','b','c','d','e','f'};
int m = strlen(buf); 
int n = sizeof(buf); 
  • m=随机值,没有/0结束符,返回的值是一个不确定的值
    n=6, 数组buf以单个元素赋值,没有/0结束符,所以所占空间的大小为6个字节。

[参考博文]
https://blog.csdn.net/Yelbosh/article/details/12656113
https://blog.csdn.net/M_joy666/article/details/80471230

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值