读书人

结构体地址计算有关问题

发布时间: 2013-04-02 12:35:26 作者: rapoo

结构体地址计算问题?
我在参加多益网络的笔试题遇到到了以下一道题,不知道该如何做,请前辈们指点下,谢了。


struct {
int a;
char b;
long c;
short d;
short e[5];
}*p;

p=0x1000000;

p+0x200=?
(unsigned long*)p+0x200=?
(unsigned char*)p+0x200=?


请问上面的计算结果是多少,是怎么计算出来的?麻烦说得详细点
[解决办法]
要有字节对齐的概念才行。




struct {
int a; /*4 byte*/
char b; /* 4 byte, 因为对齐 */
long c; /* 4 byte */
short d; /*2 byte */
short e[5]; /* 10 byte */
}*p; /* 总共 24 byte, 结构体大小为8的倍数 */

p=0x1000000;

p+0x200=? 长度为结构体长度 乘 0x200(也就是512) 12K =0X3000 , 所以p+0x200=0x1003000
(unsigned long*)p+0x200=? 4*0x200 2K=0x800 p=0x1000800
(unsigned char*)p+0x200=? 1*0x200 p=0x1000200


[解决办法]

p=0x1000000;

p+0x200; //(void*)((unsigned char*)p + sizeof(*p)*0x200)
(unsigned long*)p+0x200=? //(void*)((unsigned char*)p + sizeof(unsigned long)*0x200)
(unsigned char*)p+0x200=? //(void*)((unsigned char*)p + size(unsigned char)*0x200)

[解决办法]
指针p+整形数n,表示获得该指针类型第n个元素地址。所以
a. p+0x200= p + sizoef(struct p)*0x200
b. (unsigned long*)p+0x200= p + sizeof(unsigned long) * 0x200
c. (unsigned char*)p+0x200= p + sizeof(unsigned char) * 0x200

a,b的值与编译环境相关,32/64位的long型大小不一样,结构对齐优化开关会影响struct大小
c的值是固定的,因为sizeof(unsigned char)一定是1
[解决办法]


#pragma pack (4)
struct t_data{
int a;
char b;
long c;
short d;
short e[5];
}*p;
#pragma pack ()

int _tmain(int argc, _TCHAR* argv[])
{
p=(struct t_data*)0x1000000;
struct t_data* padd0 = p+0x200;
unsigned long* padd1 = (unsigned long*)p+0x200;
unsigned char* padd2 = (unsigned char*)p+0x200;
printf("%p %p %p\n",padd0,padd1,padd2);
}


好题目就敲一下代码,不错不错,挺好面试题目
这个公司有点意思

读书人网 >C++

热点推荐