|
今天,看了一道腾讯的笔试题 ,大意如下:
struct
MyStruct {
int
abc;
short
xyz;
char
cdf; };
char
*
p1;
void
*
p2;
int
p3;
char
p4[
10
];
//
问:
sizeof
(
struct
MyStruct)
=
?
sizeof
(p1...p4)
=
?
注意这道题的回答,必须指出一个前提:在什么环境下。刚才测试了一下,在TC环境下:
sizeof(struct MyStruct) : 5 //int为2,short为2,char 为1
任何类型的指针都为2,sizeof(数组名称) == 数组元数的总字节数。
在VC环境下:
sizeof(struct MyStruct) : 8 //int为4,short为2,char 为1,为什么不是7?
因为,VC为结构体struct、类class分配内存时,如果元素所占的总内存大于4,则以4的倍数来分配。这好像叫做边界问题。在大于4的前提下,分配的时候,按顺序,检测每个元素的大小,如果小于4,则测试它的下一个元素,如果两个元素的总大小超过了4,就给前面那个元素单独分配4,如果两个元素都小于4,而加上下一个元素又大于4,则为前面两个元素分配4。。。,这就是说,一个结构的大小,还可能跟结构体内的元素的定义顺序有关。例如:
struct
MyStruct {
int
abc; // int大小为4,分配4
short
xyz; // short大小为2,下一个元素char的大小为1,加起来小于4
char
cdf; // 所以,为xyz 、cdf 分配4 。所以MyStruct大小为8 };
但注意,这一个结构体,只是顺序变了一下,大小就变成12了:
struct
MyStruct {
short
xyz;
//
short大小为2,下一个元素int的大小为4,加起来大于4,所以单独为xyz分配4
int
abc;
//
int大小为4,分配4
char
cdf;
//
单独为cdf 分配4 。所以MyStruct大小为12
};
|