[貌似已解决]关于函数指针的2个问题,请帮帮忙.谢谢
第一个:===============================
请帮忙看下这个函数的指针如何理解?谢谢
------------------------------------------------------
#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);
}
--------------------------------------------------------------
其中我不理解的是,这个程序表达的应该是说f是一个指向函数的指针,判断的时候是判断f是否指向函数strcmp,如果是的话,就输出strcmp这个函数的地址.如果不是,就输出main函数的地址
因为函数名可以作为指针,所以if (f == strcmp)应该是说判断2个指针的地址是否相同对吧?
我用gdb 断点到此,print f和printfstrcmp得到的是不同的地址啊,并且可以发现f和*f的内容居然一样,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是指的过程链接表,是不是说只有在执行到f == strcmp时候,才把f的地址和strcmp的位置指向同一位置?
===========================================================
第二个:
------------------------------------------------------------------------------
字符串在函数调用过程中的输出,请帮忙看下.请帮忙看下,为什么出错?
-----------------------------------------------------------------------------------------
#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;
}
--------------------------------------------------------------------------------------------------------------
输出我的认为应该是先输出p1, p2以后再执行strcat. 但是实际输出的情况:
abcpacific sea pacific sea abcpacific sea
可以发现strcat先于p1执行,改变了p1的内容,请问这个内部是怎么的顺序?难道printf不是顺序执行的?
谢谢各位
[ 本帖最后由 casio1374633 于 2010-3-13 15:41 编辑 ]