c语言结构体与共同体的问题

来源:百度知道 编辑:UC知道 时间:2024/06/24 16:28:30
设有以下结构类型说明和变量定义,则变量a在内存所占字节数是多少——————。
struct stud
{ char num[6];
int s[4];
double ave;
}a,*p;

希望有详细过程

首先跟你说一下字节对齐的问题。

一般为4,具体依编译器而定

字节对齐:
1。一个占N 个字节的变量,存储在首地址偏移量为N的n倍的地址上、
2。结构体变量占的总内存大小等于它的成员的数据类型最大的n倍

字节对齐主要是为了计算机能够迅速地访问

我用的vc6.0给你分析
struct stud
{ char num[6]; // 6
int s[4]; // 16
double ave; // 8
}a,*p;

在存储int s[4]; 时,s[0]要存储在偏移量为4的倍数上,因此在存s[0]时要在num[5]后填充2个字节。
struct stud
{ char num[6]; // 6 + 2
int s[4]; // (6 + 2)+ 16
double ave; // 8
}a,*p;

在存储完s[3]后存 ave ,此时开始存储数组时的偏移量为(6 + 2)+ 16,为8(double占8字节)的倍数,所以不用填充字符。

struct stud
{ char num[6]; // 6 + 2
int s[4]; // (6 + 2)+ 16
double ave; // ((6 + 2)+ 16) + 8
}a,*p;

此时算一下a的大小为32 ,确实为8的倍数,ave后不用填充字符,所以最后a 的大小为32。

如果你用的TC编译器,int 应为2 ,double应为4,最后结果应为20(int, double占多大内存我也不确定了)

结构体 是所有的里面的类型的变量 都占内存
共同体 是所有里面类型的变量 只算占有最大内存的那个

7个char+5个int+1个double
下面我记得不太清楚 你可以翻翻书
char 是1个字节
int