3 回答

TA貢獻1784條經(jīng)驗 獲得超2個贊
唯一合法的方法是使用字符類型訪問組成指針的字節(jié)。像這樣:
#include <stdio.h>
int main() {
int (*funcptr)() = main;
unsigned char *p = (unsigned char *)&funcptr;
size_t i;
for (i = 0; i < sizeof funcptr; i++)
{
printf("%02x ", p[i]);
}
putchar('\n');
return 0;
}
void *像Dreamlax的答案一樣,將函數(shù)指針修飾為或任何非字符類型都是不確定的行為。
組成函數(shù)指針的那些字節(jié)實際上意味著什么取決于實現(xiàn)。例如,它們可以僅代表函數(shù)表的索引。

TA貢獻1785條經(jīng)驗 獲得超4個贊
使用聯(lián)合可以避免警告/錯誤,但是結(jié)果仍然是(最有可能)未定義的行為:
#include <stdio.h>
int
main (void)
{
union
{
int (*funcptr) (void);
void *objptr;
} u;
u.funcptr = main;
printf ("%p\n", u.objptr);
return 0;
}
您可以printf ("%i\n", (main == funcptr));使用if語句比較兩個函數(shù)指針(例如),以測試它們是否相等(我知道這完全違反了目的,并且很可能是無關(guān)緊要的),但實際上輸出了函數(shù)指針的地址,發(fā)生什么情況取決于目標平臺的C庫和編譯器的供應(yīng)商。
- 3 回答
- 0 關(guān)注
- 505 瀏覽
添加回答
舉報