C语言,我用指针函数 和函数指针求最大和最小值,结果错了,各位帮忙看看,错哪了·指出来。

#include<stdio.h>
int main(void)
{
int a,b,*p,z;
int *min(int x,int y);
int max(int x,int y);
int (*m)(int ,int);
m=max;
printf("Input two numbers:\n");
scanf("%d,%d",&a,&b);
p=min(a,b);
z=(*m)(a,b);
printf("min=%d\n",*p);
printf("max=%d\n",z);
return 0;
}
int *min(int x,int y)
{
int *g;
g=x<y?(&x):(&y);
return g;
}
int max(int x,int y)
{
int n;
n=x<y?y:x;
return n;
}

问题有两点:1.输入值的时候不要忘了逗号。
2.弱弱的谈谈关于内存释放的概念,所谓释放,其实就是内存管理系统将某局部变量所在内存位置标记为未使用,至于其内容变与不变,取决于该内存处是否在被标记后被其它进程占用或修改。以楼主问题为例,因为你编写的min()函数返回的是局部变量x,y中较大值的地址所以当函数调用完成,返回给p的指针所指向的x或y的空间已被释放(即对应空间被标记为未使用),其内为随机值(有可能刚被释放就被占用和修改了,所以说是随机的)。所以出现了你所看到的现象。当然,虽然你说如小值在前之时运行正确,貌似g所指向的内容未被释放,我想只是编辑器问题或者凑巧吧。
个人见解,欢迎交流。希望能帮到你。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-15
改为:
p=min(a,b);
printf("min=%d\n",*p);
z=(*m)(a,b);
printf("max=%d\n",z);
就能够得到正常结果。
你的程序在执行z = (*m)(a,b)时,不知道为什么*p的内容发生了也改变。本回答被网友采纳
第2个回答  2012-06-15
这个程序可以运行,输入的时候注意加逗号(这个问题很微妙 容易忽略 后果也很严重),但是存在严重的安全隐患,也就是传值调用问题,这么干的话,局部变量在函数调用后系统就自动回收了,地址也就成了野地址,有可能还保存着原来的值也有可能被系统拿去干别的覆盖了。所以你想用这种方法的话最好传地址。好好思考下就理解了。。。
第3个回答  2012-06-15
估计跟编译器有关,我在Dev-c里测试都正确。在Microsoft Visual 2010里,当大数在前时,min输出的是一个随机数,具体原因暂时也没看出来。。。
第4个回答  2012-06-15
修改后的程序,比你那个稳健
#include<stdio.h>
int main(void)
{
int a,b,*p,z;
int *min(int *x,int *y);
int max(int x,int y);
int (*m)(int ,int);
m=max;
printf("Input two numbers:\n");
scanf("%d,%d",&a,&b);
p=min(&a,&b);
z=(*m)(a,b);
printf("min=%d\n",*p);
printf("max=%d\n",z);
return 0;
}
int *min(int *x,int *y)
{
int *g;
g=(*x)<(*y)?x:y;
return g;
}
int max(int x,int y)
{
int n;
n=x<y?y:x;
return n;
}
相似回答