读书人

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

发布时间: 2013-08-01 15:23:18 作者: rapoo

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



请教:代码中打印那一行里面的那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地址。
我是这么理解的。不知道对不对。

读书人网 >C语言

热点推荐