【发布时间】:2014-08-05 11:32:11
【问题描述】:
我很困惑!以下所有 printf 都是打印函数地址的正确方法吗? 让我告诉你我的困惑。每次我运行所有这些 printf(即第一个 printf、第二个 printf 和第三个 printf)时,我都会在输出中得到 02D4 02D4 02D4 但是如果我删除或评论第一个和第二个 printf,我会得到以下输出 02BA 当我删除第三个 printf 语句时,我得到以下输出 02D0 当我再次取消注释所有这三个时,我得到: 02D4 02D4 02D4 为什么一个语句会影响其他 printf 行的输出? 这真的不是函数的地址吗? 我听说 s 和 &s 给出与地址相同的值(就像数组一样)。但是在这里我很困惑为什么当我尝试打印 b 时 s 和 &s 也会受到影响,其中 b=s 或 &s。
#include<stdio.h>
#include<conio.h>
int s(int);
void main()
{
int a=10,*b;
clrscr();
b=s(a++);
b=&s;
printf("%p\n",s); // 1st printf
printf("%p\n",&s); //2nd printf
printf("%p\n",b); //3rd printf
getch();
}
int s(int x)
{
return x;
}
【问题讨论】:
-
您不应该将函数指针放入变量指针中(不能保证它们的大小相同),但除此之外它似乎还可以。 C 语言的一个特殊情况是,没有
&的函数名称会隐含地获得一个(但我个人更喜欢总是让它显式) -
(虽然,与您不应该将函数指针强制转换为变量指针一样,您也不应该使用
%p格式的指针。请参阅此答案以获得安全的方法打印函数指针:stackoverflow.com/a/2741896/1180785) -
至于为什么你的地址会改变,那是因为你在重新编译脚本!即使您根本没有对代码进行任何更改,它们也很可能在编译之间存在很大差异。
-
感谢@Dave。我明白你的意思了。
标签: c function-address