2014-06-15 93 views
0

我很困惑!以下所有printf都是打印函数地址的正确方法? 让我告诉你我的困惑。每次我运行所有这些的printf的(也就是第一个printf的,第二个printf和第三的printf)的,在输出我得到 02D4 02D4 02D4 但如果我删除或第一和第二的printf的评论,我得到如下因素作为输出 02BA 当我删除第三printf语句,我得到下面的输出 02D0 当我再次取消注释所有这三个,我得到: 02D4 02D4 02D4 为什么一个语句影响其他的printf线的输出? 这不是功能的地址吗? 我听说s和& s给出了与地址相同的值(就像数组一样)。但在这里我很困惑,为什么s和& s受到影响,当我尝试打印b也是,其中b = s或& s。与功能地址混淆c

#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; 
} 
+2

你不应该把一个函数指针放入一个变量指针(它们不能保证是相同的大小),但除此之外它看起来没问题。 C语言的一个特例是没有'&'的函数名称隐式获得(我个人更喜欢总是使其明确) – Dave

+2

(尽管如此,就像不应该将函数指针转换为变量指针,你不应该使用'%p'格式。看到这个答案是一个安全的方式来打印一个函数指针:http://stackoverflow.com/a/2741896/1180785) – Dave

+1

至于为什么你的地址改变,这是因为你正在重新编译脚本!即使您完全没有对代码进行任何更改,它们在编译之间也可能会有所不同。 – Dave

回答

2

因为编译器和操作系统都可能影响结束位置,所以变量或函数的地址不是您可以依赖的。

但假设操作系统总是加载您的可执行代码在同一个地址,如果你改变的代码长度在main()功能,这很可能影响s()功能的起始地址。因此,你会得到不同的结果。

+0

谢谢@DWWATSON,我明白了 – gj1103