sizeof 问题~(仍然不明白)

来源:百度知道 编辑:UC知道 时间:2024/06/18 13:31:16
#include<stdio.h>
struct a
{
char no[10];
int p;
long int pp;
unsigned int ppp;
char x;
float y;
double h;
}xy;
void main()
{
printf("char no: %d \n",sizeof(xy.no));
printf("int p: %d \n",sizeof(xy.p));
printf("long int pp: %d \n",sizeof(xy.pp));
printf("unsigned ppp:%d \n",sizeof(xy.ppp));
printf("char x: %d \n",sizeof(xy.x));
printf("float y: %d \n",sizeof(xy.y));
printf("double h: %d \n",sizeof(xy.h));
printf("struct a: %d \n",sizeof(struct a)); // 不是等于 35 吗??? 为什么等于 40 啦 怎么计算?
}
总之 考二级C语言 时如果遇到这样的题目该怎么做~~?

百度里的查询好像有点不方便,昨天的回答我没查到,只好自己实现了一下。

在VC环境下这个结构的大小的确为40。测试的方法如下:

struct ...
{
}xy;

int i;
char *p = (char*)&xy;

for(i=0;i<40;i++)
*(p+i) = 'A';

监视xy的内容,发现:
在i=10、11(对应的是char[10]后面的两个字节)及i=26,27,28(对应是char x后面的三个字节)时,xy的内容不变。

由此判断编译器在进行内存分配的时候做了访问的优化,因为windows是32位系统,每次访问四个字节,所有四字节对齐的变量只要一次就可以访问到。

VC连接成最终程序的时候,在char[10]后面添两个字节,在char x后添了三个字节,使每个变量都四字节对齐了。所以这个结构的理论大小是35,但是编译出来的大小是40。

===========
至于考试遇上这种题目的话,有点经验的人都知道这种题是系统相关、编译器相关的,他会在题目中给出具体的类型的大小,而你只能根据这个计算出它的理论值(如这里的35)。

如果他非要考你编译器的优化,我想已经超出了二级C的水平了,错了也不能怪你,我想你能考虑到这么深入,不要这分也可以过了。

这样:

#include<stdio.h>

#pragma pack(1)
struct a
{
char no[10];
int p;
long int pp;
unsigned int ppp;
char x;
float y;
double h;
}xy;
#pragma pack()

int main()
{
printf("char no: %d \n",sizeof(xy.no))