能力值:
( LV2,RANK:10 )
|
-
-
2 楼
嘿嘿
好好学习天天向上,
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
又跟着LZ学习了下
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
看不懂 顶下
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
很好啊~学习了~谢谢分享~
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
好好学习一下啊~
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
看不懂.. 学习吧哎
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
在淘宝上订了本C++,好好学习天天向上额
|
能力值:
( LV3,RANK:20 )
|
-
-
9 楼
这个问题完全可以用C++语法来解释,用OD来调试有点杀鸡用牛刀的感觉,不过楼主的研究精神不错。建议将C++基础打好,不然遇到复杂的数据结构可不容易调试出来噢。
cout<<a.get_score(a).name<<"|"<<a.get_score(a).socre<<"|"<<endl;
上述代码等价于:
int score = a.get_score(a).socre; //first + 255
char *name = a.get_score(a).name; //second + 1023
cout<<name<<"|"<<score<<"|"<<endl;
因此结果当然是second,255了。
不过还是需要注意的是,红色的两行代码在不同的编译器下面执行的先后顺序是不一样的。好像MSVC的编译器和现在的结果一致。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
学习了···
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
喜欢这种小问题 具体 很实用 学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
学习了。。。。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
我的钱涨的好慢啊 一天才一个
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
看不懂,好好学习天天向上
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
c++ 还是相对好学的~
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
向你学习:)
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
你看我还在这里混,就知道我什么都不懂了,谢谢,路过!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
跟着学习了!不过我学的还没有lz学的那么深奥!
|
能力值:
( LV2,RANK:150 )
|
-
-
19 楼
VC编译器跟GCC/G++在对于结构体的内存对齐方面并不一样,VC一般都是进行内存对齐的,但是GCC/G++都没有。
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
其实就是一次覆盖而已,当你第二次传入参数的时候 因为是引用 所以实参和形参是同地址同内容的
第一次写入 a.GetSocre(a).m_szName
== 》 this内存地址为:0x0012ff70 数据为 first(10个字节的内容) + 255(int)
test 的内存地址也是 0x0012ff70 数据为 first(10个字节的内容) + 255(int)
第二次写入 a.GetSocre(a).m_nSocre
== 》 this内存地址为:0x0012ff70 数据为 second(都写在这个地址0x0012ff70 内容被覆盖了) + 255(int)
test 的内存地址也是 0x0012ff70 数据为 second(10个字节的内容) + 255(int)
注:当你写入超过10个字节的时候 连255也会被覆盖掉 不信的话LZ可以试下的
但是只会显示10个字节和一个int的数据
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
现在看不懂,先收藏,以后看
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
完全有压力,看不懂,不过佩服楼主啊
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
我跟了一下 发现原因是在第一次call get_score后面push过一次数值(push ecx,也就是0x000000ff这个值),在我机子上是存放于0012ff1c地址处,而在后面的call @ILT+350处的输出数值调用中用的是这里的值
004018A5 mov ecx,eax
004018A7 call @ILT+350(std::basic_ostream<char,std::char_traits<char> >::operator<<) (00401163)
继续跟进去是_Myt& operator<<(int _X)这个函数,这里传的是0x12ff1c这个地址中的值,因为[ebp+8]=[0x12ff14+8]=0x000000ff
想请问一下这个函数是怎么传参的 ,没有看到栈传参的push,而如果是寄存器传参也不对啊 因为ecx中存放的和0x12ff1c没一点关系。
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
求楼主和诸位帮小弟解惑,谢谢了
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
是存在覆盖的问题 但是超过10个字节并没有覆盖255 你试过吗?试过的话你给个输入用例。
我输入的用例是:asdsdsfdsgdg 255 awaeererwere 1023
输出是 : awaeererwere ??|255 还没报错,之后再长点就程序报错了
|
|
|