国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > C > 正文

基于函數(shù)指針的示例分析

2020-02-24 14:30:23
字體:
供稿:網(wǎng)友

本文為大家詳細(xì)介紹了關(guān)于基于函數(shù)指針的示例分析,相信很多小伙伴們都是不了解的,那么我們現(xiàn)在就跟隨武林小編一起去看看基于函數(shù)指針的示例分析的具體內(nèi)容吧。

第一個(gè):
------------------------------------------------------

?

#include <stdio.h>
#include <string.h>
void tell_me(int f(const char *, const char *));
int main(void)
{
?? tell_me(strcmp);
?? tell_me(main);
?? return 0;
}
void tell_me(int f(const char *, const char *))
{
?? if (f == strcmp) /* <-----我不理解這里*/
????? printf("Address of strcmp(): %p/n", f);
?? else
????? printf("Function address: %p/n", f);
}


--------------------------------------------------------------
其中我不理解的是,這個(gè)程序表達(dá)的應(yīng)該是說f是一個(gè)指向函數(shù)的指針,判斷的時(shí)候是判斷f是否指向函數(shù)strcmp,如果是的話,就輸出strcmp這個(gè)函數(shù)的地址.如果不是,就輸出main函數(shù)的地址
因?yàn)楹瘮?shù)名可以作為指針,所以if (f == strcmp)應(yīng)該是說判斷2個(gè)指針的地址是否相同對吧?
我用gdb 斷點(diǎn)到此,print f和printfstrcmp得到的是不同的地址啊,并且可以發(fā)現(xiàn)f和*f的內(nèi)容居然一樣,strcmp和*strcmp也一樣,請問是什么原因,如何解釋?

(gdb) print f
$1 = (int (*)(const char *, const char *)) 0x8048310 <strcmp@plt>
(gdb) print strcmp
$2 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) n
16 printf("Address of strcmp(): %p/n", f);
(gdb) print strcmp
$3 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) print *strcmp
$4 = {<text variable, no debug info>} 0xb7e59d20 <strcmp>
(gdb) print *f
$5 = {int (const char *, const char *)} 0x8048310 <strcmp@plt>
(gdb) n
Address of strcmp(): 0x8048310
19 }
(gdb) n
后來我查到plt是指的過程鏈接表,是不是說只有在執(zhí)行到f == strcmp時(shí)候,才把f的地址和strcmp的位置指向同一位置?

?

后來別人通過反匯編發(fā)現(xiàn)的情況:
==============================================
如下紅色的幾行,main與strcmp此時(shí)為常量(你也會(huì)發(fā)現(xiàn)沒有.data段),在匯編代碼中他是把這兩個(gè)常量寫入函數(shù)堆棧,然后調(diào)用函數(shù),作出對比,然后輸出。而你所說的 f ,也就是函數(shù)參數(shù),實(shí)際上它只作為預(yù)分配的參考(匯編代碼中,你是找不到 f 的)。
-------------------------------------------------------------------------------------
.file "1.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl $strcmp, (%esp)
call tell_me
movl $main, %eax
movl %eax, (%esp)
call tell_me
movl $0, %eax
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.section .rodata
.LC0:
.string "Address of strcmp(): %p/n"
.LC1:
.string "Function address: %p/n"
.text
.globl tell_me
.type tell_me, @function
tell_me:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
cmpl $strcmp, 8(%ebp)
jne .L4
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
jmp .L6
.L4:
movl 8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
.L6:
leave
ret
.size tell_me, .-tell_me
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits
==================================================
00401090 push ebp //第一題的反匯編
00401091 mov ebp,esp
00401093 sub esp,40h
00401096 push ebx
00401097 push esi
00401098 push edi
00401099 lea edi,[ebp-40h]
0040109C mov ecx,10h
004010A1 mov eax,0CCCCCCCCh //應(yīng)該說在函數(shù)傳遞時(shí),f與strcmp的地址都相同
004010A6 rep stos dword ptr [edi]
13: printf("%0x/t%0x/n",f,strcmp); //看這里,輸出f與strcmp的地址是相同的
004010A8 push offset strcmp (004011a0)
004010AD mov eax,dword ptr [ebp+8]
004010B0 push eax
004010B1 push offset string "%0x/t%0x/n" (0042201c)
004010B6 call printf (00401120)
004010BB add esp,0Ch
14: if (f == strcmp) /* <-----我不理解這里*/ //比較后,輸出的地址同樣是一樣的,
004010BE cmp dword ptr [ebp+8],offset strcmp (004011a0)
004010C5 jne tell_me+4Ah (004010da)
15: printf("Address of strcmp(): %0x/n", f);
004010C7 mov ecx,dword ptr [ebp+8]
004010CA push ecx
004010CB push offset string "Address of strcmp(): %0x/n" (00422044)
004010D0 call printf (00401120)
004010D5 add esp,8
16: else
004010D8 jmp tell_me+5Bh (004010eb)
17: printf("Function address: %p/n", f);
004010DA mov edx,dword ptr [ebp+8]
004010DD push edx
004010DE push offset string "Function address: %p/n" (00422028)
004010E3 call printf (00401120)
004010E8 add esp,8=======================================================

第二個(gè):
--------------------------------------------------------------------------------------------

?

#include <stdio.h>
#include <string.h>
int main(void)
{
?? char p1[20] = "abc", *p2 = "pacific sea";
?? printf("%s %s %s/n", p1, p2, strcat(p1, p2)); /*<-----問題出在這里*/
?? return 0;
}


---------------------------------------------------------------------------------------------
輸出我的認(rèn)為應(yīng)該是先輸出p1, p2以后再執(zhí)行strcat. 但是實(shí)際輸出的情況:
abcpacific sea pacific sea abcpacific sea
可以發(fā)現(xiàn)strcat先于p1執(zhí)行,改變了p1的內(nèi)容,請問這個(gè)內(nèi)部是怎么的順序?難道printf不是順序執(zhí)行的?
=======================================================

得到的解答:
不同的編譯器printf的函數(shù)參數(shù)進(jìn)棧順序不同,printf函數(shù)中的strcat可以看反匯編代碼.
6: printf("%s/t%s/t%s/n", p1, p2, strcat(p1, p2)); /*<-----問題出在這里*/
00401045 mov edx,dword ptr [ebp-18h]
00401048 push edx
00401049 lea eax,[ebp-14h]
0040104C push eax
0040104D call strcat (00401130) //可以看到是先調(diào)用strcat函數(shù)的,
00401052 add esp,8
00401055 push eax
00401056 mov ecx,dword ptr [ebp-18h]
00401059 push ecx
0040105A lea edx,[ebp-14h]
0040105D push edx
0040105E push offset string "%s/t%s/t%s/n" (0042201c)
00401063 call printf (004010a0) //最后調(diào)用printf函數(shù)輸出
00401068 add esp,10h
===============================================
匯編直觀而簡單的說明了一些疑問....
再說下gcc如何產(chǎn)生匯編代碼:
1: gcc -S main.c 可以生成
2: gcc -c main.c 生成main.o
objdump -S -D main.o > main.asm
我更傾向于第二種.

本篇文章是對基于函數(shù)指針的示例分析,需要的朋友參考下,更多相關(guān)內(nèi)容就在武林技術(shù)頻道。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
а√最新版在线天堂| 天天草天天操| 就爱干草视频| 国产网红女主播精品视频| 国产黄色在线免费观看| 国产中文字幕在线视频| 最近免费中文字幕在线第一页| 制服丝袜中文字幕在线观看| 国产剧情av在线| 伊人中文在线| 午夜影院在线| 中文字幕毛片| 在线视频三区| 最近免费中文字幕在线第一页 | 2018中文字幕在线| 国产美女视频一区二区三区| 丁香视频免费观看| 亚洲高清在线免费| 九九视频九九热| 天堂在线免费观看| 四虎一区二区三区| 国产一级片麻豆| 牛牛热在线视频| 永久免费av片在线观看全网站| 狠狠干五月天| 日本电影在线观看| 99热免费在线观看| 国产成人精品实拍在线| 天堂资源最新在线| 免费看ww视频网站入口| 亚洲大香人伊一本线| 国产高清在线视频| 国产视频福利在线| 中文字幕在线影视资源| av在线播放网| 亚洲精品在线播放视频| 国产精品久久久久一区二区国产| 国产在线精品一区二区不卡| 亚洲久草视频| www.99av| 精品中文字幕不卡在线视频| 久久久久久国产视频| 九九视频九九热| 麻豆视频在线观看免费网站| 日韩精品免费一区二区| 日本综合一区二区三区| 日本三级在线视频| 九九免费视频| 中文字幕不卡免费视频| √天堂资源地址在线官网| 国产美女免费观看| 国产午夜在线| 国产精品剧情一区二区三区| 国产不卡精品一区二区三区| 伊人电影在线观看| 人人澡人人爽| 国产精品一区二区三区高清在线| 国产精品伦理一区二区三区| 中文av资源在线| 全网国产福利在线播放| 99视频资源网| 在线欧美一级视频| 免费国产视频| 国产小视频免费在线网址| 国产视频青青| av大片在线播放| 狂野欧美性猛交xxxx乱大交| 天堂中文在线视频| av在线第一页| 国产福利在线免费观看| 精品国产高清a毛片无毒不卡| 伊人资源视频在线| 国产一区二区在线|播放| 伊人福利在线| 中文字幕免费中文| 成 人免费视频播放| 国产xxxx做受性欧美88| 成在线人视频免费视频| 国产第一页在线| 黄色一级片视频| 亚洲天堂影院在线观看| 国产精品久久久久白浆| 玖玖在线视频| 四虎国产精品永久在线| 国产成在线观看免费视频| 九九热在线视频观看| av中文天堂在线| √天堂资源中文www| 国产美女极品在线| 国内精品免费一区二区三区| 永久免费不卡在线观看黄网站| 国产九色视频| 中文字幕视频免费在线观看| 六月天色婷婷| 制服丝袜中文字幕在线观看| 国产黄在线观看| 国产偷倩在线播放| 狠狠狠狠狠狠操| 国产在线黄色片| 久久精品国产麻豆| 黄色国产网站在线播放| 日本高清中文字幕二区在线| 亚洲免费国产| 日本高清中文字幕在线| 日韩国产成人| 免费av不卡在线观看| 久久亚洲国产成人亚| 九九热视频在线| 激情丁香在线| 国产原创精品视频| 午夜国产福利在线| 国产精品毛片一区二区三区四区| 国产三级视频在线| 18 激情视频在线| 在线天堂av| 久草视频国产| 国产人成在线视频| 精品推荐国产麻豆剧传媒| 在线观看免费高清完整| а√天堂8资源在线官网| 狠狠操视频网| 国产国产国产国产国产国产 | 国产免费永久在线观看| 国产麻豆高清视频在线第一页| 欧美xxxxx性| 最近中文字幕mv免费高清在线| 国产激情在线观看| www.超级碰| 国产网站免费看| 亚洲欧美精品中文第三| 国产中文伊人| 一本大道五月香蕉| 九九热在线视频免费观看| 国产网友自拍视频导航网站在线观看| 国产成人精品男人的天堂538| 青青草视频在线免费观看| 国产网站麻豆精品视频| 91视频黄色| 国产鲁鲁视频在线观看特色| 亚洲欧美日韩综合精品网| 午夜av电影| 黄色av免费看| 欧美艹逼视频| av日韩国产| 国产白浆在线| 国产精品久久久久一区二区国产| 亚洲欧美久久婷婷爱综合一区天堂| 天天操天天曰| 久久精品视频观看| 精品美女调教视频| 国产偷窥洗澡视频| 国产一二三区在线视频| 日本啊v在线| 在线观看中文| 在线看黄网站| 精品av中文字幕在线毛片| 国产精品日日爱| 国产一区久久精品| 最新国产在线精品91尤物| 国产在线观看网站| 久草福利资源在线视频| 超碰免费在线观看| 久草网在线视频| 国产鲁鲁视频在线观看特色| 成在在线免费视频| 国产字幕在线看| 国产美女在线一区二区三区| 热99re久久精品这里都是免费| 亚洲妇熟xxxx妇色黄| jlzzjlzz欧美| 二区三区中文字幕| 国产视频xxxx| 亚洲精品视频在线免费| 美女被人操视频在线观看| 九九热在线视频| 国产一二区在线观看| 97操碰视频| 四虎国产精品永久地址998| 四虎成人免费观看在线网址| 日本在线观看网站| 福利在线观看| 91在线视频免费看| av福利在线| 黄色在线视频观看网站| 国产午夜三区视频在线| 91亚洲精选| 久久久久久国产视频| 国产精品美女视频免费观看软件 | 国内精品不卡| 18激情网站| 久久国产热视频| 国产网站免费观看| av免费在线一区二区三区| 久久久久久久久亚洲精品| 国产桃色电影在线播放| www免费在线观看视频| 国产精品久久精品牛牛影视| 女人色在线免费视频| 中文字幕av高清在线观看| 国产精品外围在线观看|