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

Chinaunix

標題: 請教一個指針的問題 [打印本頁]

作者: handsome-king    時間: 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í)行結果:
2ff21658|2ff21658
20|200008a8

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

另外:我如果把第二個printf改成printf( "%x|%x\n", *((struct dd *)((char *)&saa+40)),*(&(saa.point)) ),這樣結果第一個%x打出來正確的地址,第二個%x打出來的是deadbeef。這又是為什么?
執(zhí)行結果:
2ff21658|2ff21658
200008a8|deadbeef
作者: zliming    時間: 2009-06-12 14:55
*(((char *)&saa+40)),
char*后 * 就是一個char內(nèi)容,不是4字節(jié)了,還有結構對齊也要注意一下
作者: handsome-king    時間: 2009-06-12 15:08
第二個問題呢?
作者: zliming    時間: 2009-06-12 20:37
*((struct dd *)((char *)&saa+40)) == dd
*(&(saa.point))  == dd*
作者: handsome-king    時間: 2009-06-14 17:34
你是什么意思?*((struct dd *)((char *)&saa+40)) ,*(&(saa.point))這2個表達式怎么會有所說的那種區(qū)別呢? 我覺得*(&(saa.point))就相當于saa.point,為啥放前面和放后面有區(qū)別呢?請給個詳細的分析,謝謝了!^_^
作者: yug1129    時間: 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),并且被轉換成為了指向字符的指針,即(char *),所以*(((char *)&saa+40))指向的是malloc返回的內(nèi)存地址的第一個字節(jié)?磥砟闶褂玫氖谴笪捕说臋C器,因此這個字節(jié)是malloc返回的內(nèi)存地址的最高位字節(jié),也就是200008a8中的20。如果你使用X86等小尾端的機器,就應該是最低位的字節(jié)了。
作者: llsshh    時間: 2009-06-16 15:23
能不能 不用a,b,c,d啊 看著頭暈




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2