【发布时间】:2015-05-28 16:52:59
【问题描述】:
我最近在玩符号和函数指针,发现虽然以下代码运行良好:
#include <stdio.h>
int main(int argc, const char * argv[]) {
printf("%p\n",printf); // <--this line makes it work
int (*printfptr)(const char * restrict, ...);
printfptr = 0x1001fe910;
(*printfptr)("Hello world\n");
return 0;
}
这不是:
#include <stdio.h>
int main(int argc, const char * argv[]) {
// printf("%p\n",printf); // <-- commenting this out breaks it
int (*printfptr)(const char * restrict, ...);
printfptr = 0x1001fe910;
(*printfptr)("Hello world\n");
return 0;
}
(EXC_BAD_ACCESS)
当代码中没有对printf 的引用时,为什么取消引用完全相同的指针会导致问题?即使这样也可以正常工作:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int (*printfptr)(const char * restrict, ...);
printfptr = 0x1001fe910;
(*printfptr)("Hello world\n");
return 0;
}
void *_ = printf; // <-- because of this
这是为什么?
【问题讨论】:
-
在第二种情况下,链接器不知道它应该链接到“printf”函数,所以它的实现不存在。在第一种情况下,代码使用
printf,所以它是链接的。 -
如果你调用未定义的行为,你会得到未定义的结果。指针文字值根本不能保证工作。主要问题是,如果代码中没有符号名称
printf,系统就无法知道它需要使printf可用于您的代码。
标签: c pointers gcc linker dynamic-linking