首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问结构体指针打印的有关问题?多谢

2013-08-01 
请教结构体指针打印的问题?谢谢!请教:代码中打印那一行里面的那2个pst的值为什么不同?腰包不鼓,小小积分奉

请教结构体指针打印的问题?谢谢!



请教:代码中打印那一行里面的那2个pst的值为什么不同?
腰包不鼓,小小积分奉上而已,谢谢!

C struct 指针
[解决办法]
mov         ecx,dword ptr [ebp-18h]
mov         edx,dword ptr [ecx+4]
push        edx
mov         eax,dword ptr [ecx]
push        eax
mov         ecx,dword ptr [ebp-18h]
push        ecx
push        offset string "......"
call        printf ()

VC6下编译成这样了,先压栈的是pst+4,即pst.u32_b,再压栈pst.u32_a,最后压栈的是pst,不明白怎么编译成这样了,谁来解释下。
[解决办法]
上面第五次push写错了。
printf("pst:0x%08x, pst[0]:0x%08x, pst:0x%08x\n", pst, pst[0], pst);
汇编代码如下:
00401081   mov         eax,dword ptr [ebp-0Ch]
00401084   push        eax
00401085   mov         ecx,dword ptr [ebp-0Ch]
00401088   mov         edx,dword ptr [ecx+4]


0040108B   push        edx
0040108C   mov         eax,dword ptr [ecx]
0040108E   push        eax
0040108F   mov         ecx,dword ptr [ebp-0Ch]
00401092   push        ecx
00401093   push        offset string "pst:0x%08x, pst[0]:0x%08x, pst:0"... (0042201c)
00401098   call        printf (00401140)
0040109D   add         esp,14h

printf函数4个参数,push了5次。
第一次:pst
第二次:0x0000BBBB
第三次:0xAAAA0000
第四次:pst
第五次:"pst:0x%08x, pst[0]:0x%08x, pst:0"

怎么会是五次呢?
[解决办法]
第三个参数,即使你随便写,不写pst一样会打印出b的值的。以前代码就是为证。


#include<stdio.h>

typedef struct _test_B_s {
    unsigned int u32_a;
    unsigned int u32_b;
}test_B_t;
  
int main(int argc, char *argv[])

    test_B_t st_a;
    memset(&st_a, 0, sizeof(st_a));
    st_a.u32_a = 0xaaaa0000;
    st_a.u32_b = 0x0000bbbb;
    test_B_t *pst = &st_a;
     
    printf("pst:0x%08x, pst[0]:0x%08x,pst:0x%08x,pst:0x%08x\n", pst, pst[0],pst[2],pst);
    return 0;
}



说明一个问题是,printf在读取结构体时,把整个结构体读入到了缓存中。但是第一个只打印出a,缓存中仍然存在着b的数据,于是下一个打印出b,不管是什么参数。此时如果在打印出pst,可以发现,又回到正常情况,打印出pst地址。
我是这么理解的。不知道对不对。

热点排行