(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a高手帮忙进来解释一下

小枫 2010-07-09 09:32:12
struct TestStruct1
{
char c1;
short s;
char c2;
int i;
};

struct TestStruct1 a;
printf("c1 %p,s %p,c2 %p,i %p\n",
(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.s-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.i-(unsigned int)(void*)&a);
请问一下这句话怎么解释:
(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a,
...全文
314 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hetao220284 2010-07-09
  • 打赏
  • 举报
回复
内存对齐哟
pengzhixi 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jade0709 的回复:]
引用 2 楼 bluejays 的回复:

运行结果在不同的编译器,编译器的不同设置都可能不同,
一个可能的结果是: 0 2 4 8
就是说,如果整个结构体在地址a,4个成员变量的地质分别在 a、a+2、a+4、a+8

为什么是a、a+2、a+4、a+8,为什么不是a、a+2、a+4、a+6呢
[/Quote]

google内存对齐
chengshuangshuang 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jade0709 的回复:]
引用 2 楼 bluejays 的回复:

运行结果在不同的编译器,编译器的不同设置都可能不同,
一个可能的结果是: 0 2 4 8
就是说,如果整个结构体在地址a,4个成员变量的地质分别在 a、a+2、a+4、a+8

为什么是a、a+2、a+4、a+8,为什么不是a、a+2、a+4、a+6呢
[/Quote]
同感,哪位能解释下!
mymtom 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bluejays 的回复:]

还可以这么玩
printf("c1: %d\n", (int)&(((struct TestStruct1*)0)->c1));
printf("s: %d\n", (int)&(((struct TestStruct1*)0)->s));
printf("c2: %d\n", (int)&(((struct TestStruct1*)0)……
[/Quote]
这不就是offsetof吗?
bluejays 2010-07-09
  • 打赏
  • 举报
回复
还可以这么玩
printf("c1: %d\n", (int)&(((struct TestStruct1*)0)->c1));
printf("s: %d\n", (int)&(((struct TestStruct1*)0)->s));
printf("c2: %d\n", (int)&(((struct TestStruct1*)0)->c2));
printf("i: %d\n", (int)&(((struct TestStruct1*)0)->i));
mymtom 2010-07-09
  • 打赏
  • 举报
回复
何必呢!
#include <stddef.h>

用offsetof(struct TestStruct1, c1);即可
bobo364 2010-07-09
  • 打赏
  • 举报
回复
dev c++运行结果如下:
c1 00000000,s 00000002,c2 00000004,i 00000008
Press any key to continue . . .

#include<stdio.h>

struct TestStruct1
{
char c1;
short s;
char c2;
int i;
};

int main()
{
struct TestStruct1 a;
printf("c1 %p,s %p,c2 %p,i %p\n",
(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.s-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.c2-(unsigned int)(void*)&a,
(unsigned int)(void*)&a.i-(unsigned int)(void*)&a);
system("pause");
return 0;
}
bobo364 2010-07-09
  • 打赏
  • 举报
回复
(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a,

一个char类新转成一个int类型,在和转成一个int类型的内存地址相减
Jade0709 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluejays 的回复:]

运行结果在不同的编译器,编译器的不同设置都可能不同,
一个可能的结果是: 0 2 4 8
就是说,如果整个结构体在地址a,4个成员变量的地质分别在 a、a+2、a+4、a+8
[/Quote]
为什么是a、a+2、a+4、a+8,为什么不是a、a+2、a+4、a+6呢
bluejays 2010-07-09
  • 打赏
  • 举报
回复
运行结果在不同的编译器,编译器的不同设置都可能不同,
一个可能的结果是: 0 2 4 8
就是说,如果整个结构体在地址a,4个成员变量的地质分别在 a、a+2、a+4、a+8
bluejays 2010-07-09
  • 打赏
  • 举报
回复
(unsigned int)(void*)&a.c1-(unsigned int)(void*)&a,
结果是c1在这个结构体里的位置偏移量。
&a.c1就是a.c1的地质,&a就是a的地址,转换成整数再相减,就是偏移量。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧