这个C语言题我这么做对吗?

来源:百度知道 编辑:UC知道 时间:2024/06/21 08:56:49
题目是这样的:请编写函数,其功能是对传过来的两个浮点数求出和值与差值,并通过形参传送回调用函数。
以下是我编写的程序:
#include<stdio.h>
double *f(double a,double b)
{
double s[2];
s[0]=a+b;
s[1]=a-b;
return s;
}
main()
{
double a,b,*p;
scanf("%lf%lf",&a,&b);
p=f(a,b);
printf("a+b=%f,a-b=%f\n",*p,*(p+1));
}
我检查后发现有问题,主函数调用f函数后f函数中定义的数组s[2]的内存即被释放,所以*p应该不能得到正确的数值。但是程序运行的结果确实正确的,请高手解释下这是为什么呢?这个正确的结果只是一个巧合呢,还是有别的原因呢?

在vc中被掉函数的局部变量并不会随函数生命周期结束而撤销,即该空间的值将继续保持.只是无效而已,编译器不会继续维护该段空间.如果再调用其他函数,该空间会被覆写

例如,在p=f(a,b);后面追加puts("");你的结果就出错了
#include<stdio.h>
double *f(double a,double b)
{
double s[2];
s[0]=a+b;
s[1]=a-b;
return s;
}
main()
{
double a,b,*p;
scanf("%lf%lf",&a,&b);
p=f(a,b);
puts("");
printf("a+b=%f,a-b=%f\n",*p,*(p+1));
}

题目要求以形参的格式传回去:
#include<stdio.h>
void f(double* pa,double* pb)
{
*pa+=*pb;
*pb=*pa-*pb*2;
}
main()
{
double a,b;
scanf("%lf%lf",&a,&b);
f(&a,&b);
printf("a+b=%lf,a-b=%lf\n",a,b);
}

主函数调用f函数后f函数中定义的数组s[2]的内存即被释放,所以*p应该不能得到正确的数值。但是程序运行的结果确实正确的

自己写的程序检查起来比较轻松啦,

s[2]是局部变量。在执行的时候分配的空间在堆栈里面。
在函数f执行结束后,s的空间就被释放掉了。
你可以把s定义为静态变量。

double *f(double a,double b)
{