免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1905 | 回复: 6
打印 上一主题 下一主题

[C] 请教一个指针的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-12 14:42 |只看该作者 |倒序浏览
#include <stdio.h>
struct dd
{
    char ee[20];
    char ff[20];
};
struct aa
{
    char bb[20];
    char cc[20];
    struct dd *point;
};

int func( struct aa *p )
{
    strcpy( p->bb, "aaaaaaaaa" );
    strcpy( p->cc, "bbbbbbbb" );
    p->point = (struct dd *)malloc(sizeof( struct dd ));
    strcpy( p->point->ee, "eeeeeeee" );
    strcpy( p->point->ff, "ffffffff" );
    return 0;
}
int main()
{
    struct aa saa;

    memset( saa, 0x00, sizeof( struct aa ) );
    func( &saa );

    printf( "%x|%x\n", (char *)&saa+40, &saa.point );   
    printf( "%x|%x\n", *(((char *)&saa+40)),*(&(saa.point)) );


    free( saa.point );
    return 0;
}
执行结果:
2ff21658|2ff21658
20|200008a8

红色字体第一句printf是用分别用内存隐射和直接去结构元素地址的方式来打印point的指针的地址,这句打出来肯定2种方式都是一样的。
对于第二句printf,我取point指针的内容,按我的想象应该打出来是一样的啊,这2种方式实际都是指向结构dd,所以取point的内容就应该是存放的dd的地址,也应该是一样的,但是实践的结果不一样,第一个%x没打这个地址来,第二个%x打出了正确的地址来,这是为什么?(这个问题其实也知道答案了,但是还是想大虾解释清楚些)

另外:我如果把第二个printf改成printf( "%x|%x\n", *((struct dd *)((char *)&saa+40)),*(&(saa.point)) ),这样结果第一个%x打出来正确的地址,第二个%x打出来的是deadbeef。这又是为什么?
执行结果:
2ff21658|2ff21658
200008a8|deadbeef

论坛徽章:
0
2 [报告]
发表于 2009-06-12 14:55 |只看该作者
*(((char *)&saa+40)),
char*后 * 就是一个char内容,不是4字节了,还有结构对齐也要注意一下

论坛徽章:
0
3 [报告]
发表于 2009-06-12 15:08 |只看该作者
第二个问题呢?

论坛徽章:
0
4 [报告]
发表于 2009-06-12 20:37 |只看该作者
*((struct dd *)((char *)&saa+40)) == dd
*(&(saa.point))  == dd*

论坛徽章:
0
5 [报告]
发表于 2009-06-14 17:34 |只看该作者
你是什么意思?*((struct dd *)((char *)&saa+40)) ,*(&(saa.point))这2个表达式怎么会有所说的那种区别呢? 我觉得*(&(saa.point))就相当于saa.point,为啥放前面和放后面有区别呢?请给个详细的分析,谢谢了!!^_^

论坛徽章:
0
6 [报告]
发表于 2009-06-16 10:36 |只看该作者

我的看法

*(&(saa.point)) 就等于saa.point,所以第二个printf的第二个数据是saa.point中的值,也就是malloc返回的内存地址。

第一个值*(((char *)&saa+40))中的(char *)&saa+40就等于saa.point的地址,即&(saa.point),并且被转换成为了指向字符的指针,即(char *),所以*(((char *)&saa+40))指向的是malloc返回的内存地址的第一个字节。看来你使用的是大尾端的机器,因此这个字节是malloc返回的内存地址的最高位字节,也就是200008a8中的20。如果你使用X86等小尾端的机器,就应该是最低位的字节了。

论坛徽章:
0
7 [报告]
发表于 2009-06-16 15:23 |只看该作者
能不能 不用a,b,c,d啊 看着头晕
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP