c语言系列!日常学习分享!(2)
本帖最后由 武大郎 于 2017-6-2 03:03 编辑开新坑!上期答案第一题为 c因为空语句出现在判断语句下面是会影响的!比如
看,本来不该执行的,但是就因为有空语句一条!他执行了!!!!空语句也是语句,他改变了流程控制!他控制了空语句不显示!不信写个输出函数printf(“1”)放在空函数也就是前面不用加分号了;你看看输出1不!
第二题 sizeof 这个没啥说的,本身就是关键字!所以不能用! 为什么可能是因为怕乱!他重名了!之前被系统函数用过一次了,怕下次调用乱了,所以你就不能再用了,不信定义2个一样的函数名试试!在同一个程序!
第三题 a 都说了合适,而且其他都错了!为什么后边写多了你就知道!也可以百度去(学习的好办法)!
第四题 c double是浮点型!所以会有小数点!
第五题 b 可以测试很简单的 这是中画线— 这是下画线_
第六题 ddefault 这个是标准的 其他都错了!要不就不是
第七题 d 还是d 其他都错
好了入正题今天的学习
从这里可以看到今天要写的代码 是 调用传值的问题 为什么这里的值会变成这样呢!
流程不懂的下个断点用f9 下载main函数哪里然后 f 10 走一步 看黄色箭头就知道他怎么走了
原因就是他对main函数里的值只是复制了一份过去!并没有直接修改main里边的变量,所以自增哪里只是自增自己传过去的值!
这里牵扯到内存分配的问题,是反汇编的。。。怎么跟你们讲呢,一大堆!我给你们分析下,画个堆栈图吧!
4: void main()
5: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,
0040102C mov ecx,11h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr
6: int num=3; //定义变量num 赋值3
00401038 mov dword ptr ,3
7: add(num); //调用函数add并传递值num
0040103F mov eax,dword ptr
00401042 push eax
00401043 call @ILT+0(add) (00401005) 跳转这里 1111111111111111111111111111111
00401048 add esp,4
8: printf("%d\n",num); //输出数值!
0040104B mov ecx,dword ptr
0040104E push ecx
0040104F push offset string "%d\n" (0042001c)
00401054 call printf (004010e0)
00401059 add esp,8
9: }
0040105C pop edi
0040105D pop esi
0040105E pop ebx
0040105F add esp,44h
00401062 cmp ebp,esp
00401064 call __chkesp (00401160)
00401069 mov esp,ebp
0040106B pop ebp
0040106C ret
1111111111111111111111111111111111111
10: void add(int num)
11: {
00401080 push ebp
00401081 mov ebp,esp
00401083 sub esp,40h
00401086 push ebx
00401087 push esi
00401088 push edi
00401089 lea edi,
0040108C mov ecx,10h
00401091 mov eax,0CCCCCCCCh
00401096 rep stos dword ptr
12: num++; //自增
00401098 mov eax,dword ptr
0040109B add eax,1
0040109E mov dword ptr ,eax
13: printf("%d\n",num);//输出!
004010A1 mov ecx,dword ptr
004010A4 push ecx
004010A5 push offset string "%d\n" (0042001c)
004010AA call printf (004010e0)
004010AF add esp,8
14: }
004010B2 pop edi
004010B3 pop esi
004010B4 pop ebx
004010B5 add esp,40h
004010B8 cmp ebp,esp
004010BA call __chkesp (00401160)
004010BF mov esp,ebp
004010C1 pop ebp
004010C2 ret
到这里就算完了,就不继续跟了,后边的pop都是恢复堆栈的,调用完毕后会恢复成一开始的样子,但是内存中使用过的数据是没清除的!
从这里可以看到关键代码!他跟add函数进去之后
mov eax,dword ptr 这是当初call进来的时候存入的eax 所以他更改的值
0040109B add eax,1
0040109E mov dword ptr ,eax
那吗谁给eax的值呢
mov eax,dword ptr
00401042 push eax
00401043 call @ILT+0(add) (00401005)
是这段 ,可以看出,这是刚开始的传入值,传入后,他就跟原来的函数内存没关系了!他复制了一份到新分配的内存里,他后边修改的就不是他这个值了,一个三一个四还是很好辨认的
。。。。。。反正我看着一目了然!你们看我觉得应该很蒙吧!我也这样蒙过!本来说推荐补习班的,后来想想,你们学不会跟我有毛关系!{:5_125:}被坑也没事,又不是我的钱!管理要是给我判断为广告了,损失的就是我了~~{:5_119:}下一贴走起
问下这是看谁的视频 看看大佬发的
页:
[1]