一道关于计算内存地址的题目

来源:百度知道 编辑:UC知道 时间:2024/06/06 02:53:20
以下代码打印的结果是(假设运行在i386系列计算机上):

struct st_t

{

int status;

short* pdata;

char errstr[32];

};

st_t st[16];

char* p = (char*)(st[2].errstr + 32);

printf("%d", (p - (char*)(st)));

A 32 B 114

C 120 D 1112

最好写明步骤,会有加分。

我认为答应应该是B,114。
步骤如下:

我们先分析一下 struct st_t 的结构,里面有1个int,1个指针,32个char。在386中,int占2个字节(16位),指针占4个字节(32位),char占一个字节(8位)。所以我们知道:这个struct st_t中,首先int占2个字节,然后short*指针占4个字节,然后char类型的数组占32字节。这样一个st_t结构体的大小是2 + 4 + 32 = 38字节。好了,有了这些基础,我们再看下面的代码。

char* p = (char*)(st[2].errstr + 32);
st[2].errstr + 32是在st[2].errstr的首地址加上32个字节,正好是下一个st的首地址,也就是st[3]的首地址。这样p - (char*)(st))就相当于st[3]的首地址减去st[0]的首地址,结果应该是3个st_t的结构体的大小(中间包含了st[0], st[1], st[2]),所以结果应该是3 * 38 = 114。