结构体地址问题

yeyi771 2010-06-09 03:57:06
VC++6.0下

#include <stdio.h>

struct ddd
{
int a;
char *p;
};

void main()
{
ddd d;

printf("%12d,%12d\n",d,&d);
d.a = 10;
d.p = 0;
printf("%12d,%12d\n",d,&d);
d.a = 0;
d.p = (char *)10;
printf("%12d,%12d\n",d,&d);
d.a = 11;
d.p = (char *)19;
printf("%12d,%12d\n",d,&d);
}
// 输出
// -858993460, -858993460
// 10, 0
// 0, 10
// 11, 19

我认为,&d 输出的值应该与 d.a 的值相同,
可为什么这不同,要命的是为什么 d 的值
会与 a 的值有关系??
...全文
135 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeyi771 2010-06-10
  • 打赏
  • 举报
回复
还是七楼说得好。
我也弄明白了,实际上是printf 输出结构体的问题。

printf 输出结构体时,会把所有的结构体元素全都输出,
如上 printf("%d,%d",d);

则相当于 printf("%d,%d",d.a,d.p);
所以会有那样的结果。

呵呵,算是我误导大家了,不好意思……
wqkjj 2010-06-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yeyi771 的回复:]
还是七楼说得好。
我也弄明白了,实际上是printf 输出结构体的问题。

printf 输出结构体时,会把所有的结构体元素全都输出,
如上 printf("%d,%d",d);

则相当于 printf("%d,%d",d.a,d.p);
所以会有那样的结果。

呵呵,算是我误导大家了,不好意思……
[/Quote]

LZ这样理解好象是很有问题的。
printf("%d %d",d,&d); 应该理解为输出结构的地址,并且将地址转换成long而已(实际上地址是一个long)。这个和printf("%s\n", (char *)&d)是不一样的。
实际上,在其他平台上测试输出是地址值是期待的结果。

这里肯怕是VC编译器或者C库存在问题。
kkbel 2010-06-09
  • 打赏
  • 举报
回复
输出结构体 不会成功,只会默认为第一个成员的值 就是INT的值 你&d 不明白了,自动输出了结构体中指针的值吗?
z569362161 2010-06-09
  • 打赏
  • 举报
回复
数据类型不同啊!,&d 输出的值应该与 d.a 的值相同,
怎么可能呢!
harbincampus 2010-06-09
  • 打赏
  • 举报
回复
是啊,Printf怎么能输出一个结构体呢
challenge99 2010-06-09
  • 打赏
  • 举报
回复
分开写

printf("12%d\n", d);
printf("12%d\n", &d);
jldream110 2010-06-09
  • 打赏
  • 举报
回复
楼主这程序有意义吗 能验证结构体的初始地址和 成员a 或者p地址的关系吗 我感觉不能吧。。。。你给a,和p赋值 和他们的地址有啥关系 也没见过 printf 能用 %d 输出 结构体变量。
wqkjj 2010-06-09
  • 打赏
  • 举报
回复
关注一下,unix下测试是正常的,可能和编译器相关。
pengzhixi 2010-06-09
  • 打赏
  • 举报
回复
你什么时候看到别人用printf输出一个结构体的呢?只能输出结构体的成员或者地址。
huanmie_09 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hqin6 的回复:]

d是一个结构体,a是int,怎么会一样?

lz是不是想说下面这个??

struct d
{
int a;
char* p;
};

d.a = 10;
cout << *((int*)&d)


其实lz是不是想说d的首地址和d里的a的地址一样??
[/Quote]
楼主想问的是&d与结构体里的d.p的指向为什么是一样的.
pengzhixi 2010-06-09
  • 打赏
  • 举报
回复
printf可以输出一个结构体?
太乙 2010-06-09
  • 打赏
  • 举报
回复
d是一个结构体,a是int,怎么会一样?

lz是不是想说下面这个??

struct d
{
int a;
char* p;
};

d.a = 10;
cout << *((int*)&d)


其实lz是不是想说d的首地址和d里的a的地址一样??



70,037

社区成员

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

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