一个测试 C语言中各种数据类型的简单函数实现

#include <stdio.h>


#if 1


typedef struct MyStruct
{
double dda0;
char dda1;
short dda3;
double dda4;
int type ;
}testS;

 

char *p;
char *q[20];
char *m[20][20];
int (*n)[10];

testS k;

 

#define TITLE() printf("%-20s" "  %-10s/n", "Data Type", "Data Size")
#define PRINTSIZE(type) printf("%-20s"": %-10d/n", #type,sizeof(type))

 

void main(void)
{
 TITLE();
 memset(&k, 0, sizeof(testS));
 PRINTSIZE(int);
 PRINTSIZE(char);
 PRINTSIZE(short);
 PRINTSIZE(long);
 PRINTSIZE(double);
 PRINTSIZE(float);
 PRINTSIZE(long int);
 PRINTSIZE(long double);
 PRINTSIZE(long float);

 PRINTSIZE(p);
 PRINTSIZE(q);
 PRINTSIZE(m);
 PRINTSIZE(n);
 PRINTSIZE(k);
}


#endif

 

 

该程序在我的机器(32位,P4)上的运行结果如下:

Data Type             Data Size
int                 : 4
char                : 1
short               : 2
long                : 4
double              : 8
float               : 4
long int            : 4
long double         : 8
long float          : 8
p                   : 4
q                   : 80
m                   : 1600
n                   : 4
k                   : 32
Press any key to continue

 

我们看到了这个结果, 其中有一项

k                   : 32

说明struct MyStruct的大小是32bytes.

有些人会认为应该是24才对.

 

下面我们来分析一下为什么会是32:

首先我来看以下结构:

typedef struct MyStruct
{
double dda0;
char dda1;
short dda3;
double dda4;
int type ;
}testS;

double类型占8bytes,这个是没有问题的了 , 接下来 char类型占1byte,short类型占2bytes,int类型占4bytes,

我们常认为在32位机上内存的对齐方式是4bytes(32位)对齐。使用我们认为的dda1和dda2占4bytes, 这样算下来就是8+4+8+4=24.

但是在这里不是这样的了,在这个结构里有double 类型,它是一个c的基本类型,在这里内存的对齐方式是8bytes。这是因为

struct中的各成员变量的存储地址有一套对齐的机制。这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足;第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。

所以testS的大小是8+8+8+8=32

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值