【考研:计组原理】
题目描述
某计算机存储器按照字节编址,采用小端方式存储数据,假定编译器规定int和short型长度分别为32位和16位,并且数据按照边界对齐存储。 某C语言的程序段如下:
struct
{
int a;
char b;
short c;
} record;
record.a = 273;
若record变量的首地址为0xC008,则地址0xC008的内容以及record.c的地址分别为:
A . 0x00 0xC00D B . 0x00 0xC00E
C . 0x11 0xC00D D . 0x11 0xC00E
【解析】
1.小端方式:高字节存放高地址,低字节存放低地址
2.int型长度为32位,a占4个字节,a的内容转换成16进制表示为0x00 00 01 11
3.存放地址
地址 | 0xC008 | 0xC009 | 0xC00A | 0xC00B |
---|---|---|---|---|
内容 | 0x11 | 0x01 | 0x00 | 0x00 |
地址 | 0xC00C | 0xC00D | 0xC00E | 0xC00F |
内容 | record.b | record.c | record.c |
0xC00D本来该存放record.c,但是0xC00D是奇数,不是2字节(short的长度)的整数倍,所以里面为空。
【变式】如果结构体为
struct{
char a;
int b;
short c;
}record;
record.a=273;
地址 | 0xC008 | 0xC009 | 0xC00A | 0xC00B |
---|---|---|---|---|
内容 | record.a | - | - | - |
地址 | 0xC00C | 0xC00D | 0xC00E | 0xC00F |
内容 | record.b(0x11) | record.b(0x01) | record.b(0x00) | record.b(0x00) |
地址 | 0xC010 | 0xC011 | 0xC012 | 0xC013 |
内容 | record.c | record.c | - | - |
此时record占字节总数为12个字节,为最大字节成员(int)的整数倍。
0xC00C是int字节长度(sizeof(int)=4)的整数倍。