C-sizeof和strlen区别,以及sizeof如何计算结构体大小

come from :  https://www.cnblogs.com/lifexy/p/10386552.html

sizeof和strlen区别

  • sizeof是关键字,在编译时就能计算出值,可以计算任何类型
  • strlen是函数,只有在运行时才能去计算,且只能计算字符型的.

对于数组时,strlen是判断’\0’为标志结尾的,而sizeof则计算的是数组整个空间
示例如下:

char buf1[]="abcde";
char buf2[30]="ABC";
printf("buf1: %d %d\n",sizeof(buf1),strlen(buf1));
printf("buf2: %d %d\n",sizeof(buf2),strlen(buf2));

打印如下:

可以看到当我们的buf1没有指定长度时,sizeof打印的是6,这是因为它把’\0’也包含进去了.


sizeof还可以计算类型大小,一般对于32位C程序而言,对应的long则为4字节
如下图所示:

示例:

 

printf("char: %d\n",sizeof(char));
printf("short: %d\n",sizeof(short)); 
printf("int: %d\n",sizeof(int));
printf("long: %d\n",sizeof(long)); 
printf("long long: %d\n",sizeof(long long));
printf("float: %d\n",sizeof(float)); 
printf("double: %d\n",sizeof(double));

 

打印如下:

 

sizeof计算结构体大小
计算机为了加快取读结构体的内容速度,所以会对结构体进行字节对齐.
字节对齐的规律就是:结构体大小必须是最大成员的倍数(方便寻址)
示例1:

 

struct TestA{
  short a;
  long b;    //b=4, a=2 ,而5%4=1,所以会在a上面补齐3字节,所以s1=8
};
struct TestB{
  char c;
  TestA d;    
  int f;    //c=1,d=8,f=4,而1+8+4=13,13%8=5,还差3字节,所以会在c上面补齐3字节, s2=16
              
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}

 

打印如下:

 

示例2:

 

struct TestA {
  short a;
  long b;    //s1=8,之前已经分析过
};
struct TestB{
  char c;
  TestA d;    
  long long f;    //c=1,s1=8,f=8,由于8最大,且17%8=1,所以会在c上面补齐7字节,则s2=24
};
int main()
{
  printf("%d\n",sizeof(TestA));
  printf("%d\n",sizeof(TestB));
}

 

打印如下:

 

#include <stdio.h>
#include <string.h>
typedef struct {
        char a;
        int b;
        double c;
}type_t;
//第一个OFFSET宏
//#define OFFSET(TYPE , MEMBER , OFF) \
        TYPE temp; \
        OFF = (unsigned long)(&(temp.MEMBER)) - (unsigned long)(&(temp));
//第二个OFFSET宏
#define OFFSET(TYPE , MEMBER)((unsigned long)(&(((TYPE *)0)->MEMBER)))
int main(void)
{
        int offset = 0;
        type_t type;
        //offset = (unsigned long)(&(type.c)) - (unsigned long)(&(type));         //不使用宏
        //OFFSET(type_t , c , offset);  //使用第一个OFFSET
        offset = OFFSET(type_t , c);    //使用第二个OFFSET
        printf("offset = %d\n" , offset);
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值