【发布时间】:2016-05-02 08:45:52
【问题描述】:
#include <stdio.h>
#include <conio.h>
int f(int a){
int i,f=1;
for(i=1; i<a; i++)
f=f*i;
return f;
}
void main(){
int k;
clrscr();
int (*u)(int);
u=&f;
printf("%d", u);
getch();
}
上面的代码在TurboC++上打印657,输出不随时间变化,那不是垃圾值吗?
#include <stdio.h>
int f(int a){
int i,f=1;
for(i=1; i<a; i++)
f=f*i;
return f;
}
int main(){
int k;
int (*u)(int);
u=&f;
printf("%d", u);
return 0;
}
而这个修改版的代码,返回:
4199220 on CodeBlocks
4199728 on DevC++
134521824 on OnlineIDE
134513824 on gcc 4.9.2
而且这些值似乎不会随着不同的运行而改变。 输出当然取决于编译器,但 请解释一下这个输出是如何产生的?
【问题讨论】:
-
未定义行为会做未定义和变化的事情。 11 点有更多新闻。
-
你正在打印函数 f 的地址。它不必是任何特定的值。
-
另外,正确的格式说明符应该是 %p (
void*和void(*)()之间也可能存在一些问题) -
NAA 但使用
int main(void)而不是void main() -
每天都有人想要定义未定义的行为:(如果你想确切地知道你的系统上发生了什么,那么你自己单步执行汇编指令就会发现。不要打扰但是,发布您的结果,因为它们仅适用于您的系统,对其他人无用。
标签: c pointers output function-pointers