struct node
{
Item item; node *l, *r;
node(Item x) {item = x; l = 0; r = 0;}
};
typedef node* link;
link max(Item a[], int l, int r)
{
int m = (l+r)/2;
link x = new node(a[m]);
if (l==r) return x; // return a local pointer
x->l = max(a, l, m);
x-r = max(a, m+1, r);
Item u = x->l->item, v = x->r->item;
if (u>v) x->item = u;
else x->item=v;
return x; // return a local pointer
}
这是Robert Sedgewick的“Algorithm in c ++”中的一段代码,第252页,程序5.19。在函数max()
中,返回的变量是在函数内部创建的指针。
在我看来,c / c ++中不允许返回本地指针。所以我的问题是“编写这样的函数是否可以”?我不敢相信这样一本经典的书会犯这样的错误。或者我误解了原理? 请帮忙。感谢。
答案 0 :(得分:5)
x
不是“本地指针” - 即指向局部变量的指针。 *x
是使用new
分配的。 x
指向动态分配的内存并返回该指针就好了。所以是的,可以编写像这样的函数,并且书中没有错误。
答案 1 :(得分:3)
返回指向局部变量的指针是错误的。 x
指向堆上分配的变量:
link x = new node(a[m]);
因此x
没有指向局部变量。
返回指向局部变量的指针的一个错误是,只要函数处于活动状态(即在它之间进入和退出),这样的变量就存在。在堆上分配的变量(例如使用new
运算符)存在,直到它们被解除分配(例如使用delete
运算符)。
答案 2 :(得分:1)
这很好,因为x
的内容是在堆上分配的,而不是堆栈。您可能会感到困惑,因为那里有typedef node* link;
,使其看起来像堆栈分配,因为它掩盖了x
实际上是node *
的事实。