VC里的sizeof和Struct(上)

前几天老师留了一个程序题如下:
#include <stdio.h>
#include <stdlib.h>

int main()
{

	char* ss1 = "0123456789";
	char ss2[] = "0123456789";
	char ss3[100] = "0123456789";

	int ss4[100];

	char q1[] = "abc";
	char q2[] = "a\n";
	char* q3 = "a\n";

	char *str1 = (char*) malloc(100);
	void *str2 = (void*) malloc(100);

	printf("sizeof(ss1) is %d\n", sizeof(ss1));
	printf("sizeof(ss2) is %d\n", sizeof(ss2));
	printf("sizeof(ss3) is %d\n", sizeof(ss3));
	printf("sizeof(ss4) is %d\n", sizeof(ss4));

	printf("sizeof(q1) is %d\n", sizeof(q1));
	printf("sizeof(q2) is %d\n", sizeof(q2));
	printf("sizeof(q3) is %d\n", sizeof(q3));

	printf("sizeof(str1) is %d\n", sizeof(str1));
	printf("sizeof(str2) is %d\n", sizeof(str2));


	free(str1);
	free(str2);

	return 0;
}

题目的具体输出结果,你可以运行一下。。然后自己再想一下就差不多了

看了题目之后,自己觉得挺迷茫的,于是就百度了一下sizeof函数,发现了struct的大小分配挺有意思的。。

于是自己就写了一段代码,貌似有点乱:

#include <stdio.h>


struct s1 
{
	char c;
	double d;
	int i;

};

struct s2
{
	char c;
	int i;
	double d;
};

struct s3
{
	char c;
	struct s1 s;
};

struct s4
{
	char c;
	struct s2 s;
};

struct s5 
{
	char c;
	char c1;
	char c2;
};


#pragma pack(push)
#pragma pack(1)

struct ps1 
{
	char c;
	double d;
	int i;
	
};

struct ps2
{
	char c;
	int i;
	double d;
};

struct ps3
{
	char c;
	struct ps1 s;
};

struct ps4
{
	char c;
	struct ps2 s;
};

struct ps5
{
	char c;
	char c1;
	char c2;
};

struct ps6
{
	char c;
	struct s1 s;
};

struct ps7
{
	char c;
	struct s2 s;
};
#pragma pack(pop)


#pragma pack(push)
#pragma pack(2)

struct ps8
{
	char c;
	struct s1 s;
	char c1;
};
struct ps9
{
	char c;
	struct ps1 s;
};
struct ps10
{
	int c;
	struct s2 s;
};
struct ps11
{
	int c;
	struct ps2 s;
};
struct ps12
{
	char c;
	struct s5 s;
};

#pragma pack(pop)


//验证pragma的作用域
#pragma pack(push)
#pragma pack(4)
struct ps13
{
	char c;
	int i;
	char c1;
	double s;
	double s1;
};
struct ps14
{
	char c;
	char c1;
	int i;
	double s;
	double s1;
};

#pragma pack(pop)

struct ps16
{
	int i;
	double d;
	struct ps13 s;
};


#pragma pack(push)
#pragma pack(2)
struct ps17
{
	char c;
	int i;
	char c1;
	double d;
	double d1;
	struct ps13 s;
	struct s1 x;
};
#pragma pack(pop)


#pragma pack(push)
#pragma pack(2)
struct ps19
{
	char c;
	int i;
	char c1;
	double d;
	double d1;
};
#pragma pack(pop)
#pragma pack(push)


#pragma pack(4)
struct ps20
{
	char c;
	double d;
	char x;
	struct ps19 s;
};
#pragma pack(pop)

void main(){

	struct s1 *s;
	printf("sizeof(s1) = %d\n",sizeof(s1));
	printf("sizeof(s1->c) = %d\n",sizeof(s->c));
	printf("sizeof(s2) = %d\n",sizeof(s2));
	printf("sizeof(s3) = %d\n",sizeof(s3));
	printf("sizeof(s4) = %d\n",sizeof(s4));
	printf("sizeof(s5) = %d\n",sizeof(s5));
	
	printf("sizeof(ps1) = %d\n",sizeof(ps1));
	printf("sizeof(ps2) = %d\n",sizeof(ps2));
	printf("sizeof(ps3) = %d\n",sizeof(ps3));
	printf("sizeof(ps4) = %d\n",sizeof(ps4));
	printf("sizeof(ps5) = %d\n",sizeof(ps5));
	printf("sizeof(ps6) = %d\n",sizeof(ps6));
	printf("sizeof(ps7) = %d\n",sizeof(ps7));

	printf("sizeof(ps8) = %d\n",sizeof(ps8));
	printf("sizeof(ps9) = %d\n",sizeof(ps9));
	printf("sizeof(ps10) = %d\n",sizeof(ps10));
	printf("sizeof(ps11) = %d\n",sizeof(ps11));
	printf("sizeof(ps12) = %d\n",sizeof(ps12));
	
	printf("sizeof(ps13) = %d\n",sizeof(ps13));
	printf("sizeof(ps14) = %d\n",sizeof(ps14));
	printf("sizeof(ps16) = %d\n",sizeof(ps16));
	printf("sizeof(ps17) = %d\n",sizeof(ps17));
	printf("sizeof(ps20) = %d\n",sizeof(ps20));

	printf("sizeof(ps20) = %d\n",sizeof(ps20));
}

结合百度百科的解释和调试,自己的理解如下:
1. 首先提到一个数,这个数跟结构体有关,假设为offsetNum. 当使用了#pragma pack(n)时,offsetNum=min(n,所有类型或结构体的offsetNum)是可以嵌套使用的.其中基本类型short,int,float,double等的offsetNum = sizeof(基本类型),

2.结构体中单个成员的空间分配顺序与其定义的顺序一致,并且其相对首地址的偏移量是min(n,该成员的offsetNum)的整数倍,不够的话用CC填充。

3.最终结构体的大小要是offsetNum的整数倍。。不够的话也用CC填充

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值