亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1921 | 回復(fù): 6
打印 上一主題 下一主題

[C] 請教一個指針的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 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;
}
執(zhí)行結(jié)果:
2ff21658|2ff21658
20|200008a8

紅色字體第一句printf是用分別用內(nèi)存隱射和直接去結(jié)構(gòu)元素地址的方式來打印point的指針的地址,這句打出來肯定2種方式都是一樣的。
對于第二句printf,我取point指針的內(nèi)容,按我的想象應(yīng)該打出來是一樣的啊,這2種方式實際都是指向結(jié)構(gòu)dd,所以取point的內(nèi)容就應(yīng)該是存放的dd的地址,也應(yīng)該是一樣的,但是實踐的結(jié)果不一樣,第一個%x沒打這個地址來,第二個%x打出了正確的地址來,這是為什么?(這個問題其實也知道答案了,但是還是想大蝦解釋清楚些)

另外:我如果把第二個printf改成printf( "%x|%x\n", *((struct dd *)((char *)&saa+40)),*(&(saa.point)) ),這樣結(jié)果第一個%x打出來正確的地址,第二個%x打出來的是deadbeef。這又是為什么?
執(zhí)行結(jié)果:
2ff21658|2ff21658
200008a8|deadbeef

論壇徽章:
0
2 [報告]
發(fā)表于 2009-06-12 14:55 |只看該作者
*(((char *)&saa+40)),
char*后 * 就是一個char內(nèi)容,不是4字節(jié)了,還有結(jié)構(gòu)對齊也要注意一下

論壇徽章:
0
3 [報告]
發(fā)表于 2009-06-12 15:08 |只看該作者
第二個問題呢?

論壇徽章:
0
4 [報告]
發(fā)表于 2009-06-12 20:37 |只看該作者
*((struct dd *)((char *)&saa+40)) == dd
*(&(saa.point))  == dd*

論壇徽章:
0
5 [報告]
發(fā)表于 2009-06-14 17:34 |只看該作者
你是什么意思?*((struct dd *)((char *)&saa+40)) ,*(&(saa.point))這2個表達式怎么會有所說的那種區(qū)別呢? 我覺得*(&(saa.point))就相當(dāng)于saa.point,為啥放前面和放后面有區(qū)別呢?請給個詳細的分析,謝謝了!^_^

論壇徽章:
0
6 [報告]
發(fā)表于 2009-06-16 10:36 |只看該作者

我的看法

*(&(saa.point)) 就等于saa.point,所以第二個printf的第二個數(shù)據(jù)是saa.point中的值,也就是malloc返回的內(nèi)存地址。

第一個值*(((char *)&saa+40))中的(char *)&saa+40就等于saa.point的地址,即&(saa.point),并且被轉(zhuǎn)換成為了指向字符的指針,即(char *),所以*(((char *)&saa+40))指向的是malloc返回的內(nèi)存地址的第一個字節(jié)?磥砟闶褂玫氖谴笪捕说臋C器,因此這個字節(jié)是malloc返回的內(nèi)存地址的最高位字節(jié),也就是200008a8中的20。如果你使用X86等小尾端的機器,就應(yīng)該是最低位的字節(jié)了。

論壇徽章:
0
7 [報告]
發(fā)表于 2009-06-16 15:23 |只看該作者
能不能 不用a,b,c,d啊 看著頭暈
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP