c语言_结构体、联合体大小计算

目录

结构体大小计算

 嵌套结构体大小计算

联合体(共用体)大小计算

 练习一

练习二


为什么存在内存对齐?

        1.平台原因:某些平台只能在某些地址处取得特定的类型的数据;

        2.性能原因:对齐的内存访问只需要一次;没有对齐的需要两次;

 因此在声明的时候,就要把空间小的成员,集中放在一起;

不同编译器下的默认对齐数是不一样的:

        vs编译器 默认对齐数是:8;

        linux环境下没有默认对齐数,换言之,自身大小就是对齐数。

以下运行环境为vs编译器下运行;

结构体大小计算

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

struct S2
{
	char c1; // 大小1  对齐数 1
	int i;   // 大小 4  对齐数 4
	char c2; // 大小1  对齐数 1
};
int main() 
{
	struct S2 s;
	printf("%d\n",sizeof(s));
	return 0;
}

        

 嵌套结构体大小计算

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

 struct S3 {
        double d;  //大小 8   对齐数 8
        char c;   // 大小 1   对齐数 1
        int i;    //大小 4    对齐数 4
    };
 struct S4 {
        char c1;        //大小 1  对齐数 1
        struct S3 s3;   // 大小 16
        double d;       // 大小8 对齐数 8
    };
int main()
{
   
    printf("%d\n", sizeof(struct S3));
   
    printf("%d\n", sizeof(struct S4));
	return 0;
}

 

联合体(共用体)大小计算

需要注意的是,联合体内,成员会共用内存空间的第一个字节;

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

union Un {
	char c;
	int i;
};
int main()
{
	union Un u;

	printf("%d\n",sizeof(u));

	printf("%p\n",sizeof(&u));
	printf("%p\n",sizeof(&u.c));
	printf("%p\n",sizeof(&u.i));
	return 0;
}

 练习一

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

union Un {
	char arr[5];  //大小5  对齐数 1
	int i;	//大小4	 对齐数 4	
};

int main()
{
	union Un u;
	printf("%d\n", sizeof(u));
	return 0;
}

 

练习二

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

union Un {
	short arr[7];  //大小14  对齐数 2
	int i;	//大小4	 对齐数 4	
};

int main()
{
	union Un u;
	printf("%d\n", sizeof(u));
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值