【发布时间】:2012-01-23 09:15:27
【问题描述】:
当我从函数返回指针时,它的值可以单独访问。但是,当使用循环输出该指针变量的值时,会显示错误的值。我在哪里犯错误,无法弄清楚。
#include <iostream>
#include <conio.h>
int *cal(int *, int*);
using namespace std;
int main()
{
int a[]={5,6,7,8,9};
int b[]={0,3,5,2,1};
int *c;
c=cal(a,b);
//Wrong outpur here
/*for(int i=0;i<5;i++)
{
cout<<*(c+i);
}*/
//Correct output here
cout<<*(c+0);
cout<<*(c+1);
cout<<*(c+2);
cout<<*(c+3);
cout<<*(c+4);
return 0;
}
int *cal(int *d, int *e)
{
int k[5];
for(int j=0;j<5;j++)
{
*(k+j)=*(d+j)-*(e+j);
}
return k;
}
【问题讨论】:
-
打开编译器警告,然后阅读它们。
-
很少有(如果有的话)需要从函数返回指针的情况。以我的经验,返回指针的需求通常源于有缺陷的程序设计。大多数情况下,您会通过其中一个参数返回结果,并让调用者担心在哪里分配数据。
-
@Lundin 有一些值得注意的例外(例如,查找函数可能会失败)。另一方面,只有在绝对必要时才应使用通过其中一个参数返回,当分析器说您别无选择时。大多数时候,正确的解决方案是按值返回。当然,这意味着不使用 C 样式数组(但总的来说这是一个很好的建议)。
-
@Lundin 在 C 中,当然,您的选择要少得多。从历史上看,C 程序会使
k在cal中成为静态的。这在他的精确示例中会起作用,但否则会导致“令人惊讶”的行为永无止境。尽管如此,每当标准 C 库必须返回一个指针时,它就是这样做的。