返回一个本地指针

时间:2012-03-20 00:07:02

标签: c++ local-variables

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 ++中不允许返回本地指针。所以我的问题是“编写这样的函数是否可以”?我不敢相信这样一本经典的书会犯这样的错误。或者我误解了原理? 请帮忙。感谢。

3 个答案:

答案 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 *的事实。