Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回一个本地指针_C++_Local Variables - Fatal编程技术网

C++ 返回一个本地指针

C++ 返回一个本地指针,c++,local-variables,C++,Local Variables,这是Robert Sedgewick的“c++中的算法”中的一段代码,第252页,程序5.19。在函数max()中,返回的变量是在函数内部创建的指针 在我看来,在c/c++中不允许返回本地指针。所以我的问题是“写这样的函数可以吗”?我不敢相信这样一本经典的书会犯这样的错误。还是我误解了原则? 请帮忙。谢谢。x不是“局部指针”——也就是指向局部变量的指针*x是使用new分配的x指向动态分配的内存,返回该指针就可以了。是的,编写这样的函数是可以的,书中没有错误。返回指向局部变量的指针是错误的x指向堆

这是Robert Sedgewick的“c++中的算法”中的一段代码,第252页,程序5.19。在函数
max()
中,返回的变量是在函数内部创建的指针

在我看来,在c/c++中不允许返回本地指针。所以我的问题是“写这样的函数可以吗”?我不敢相信这样一本经典的书会犯这样的错误。还是我误解了原则?
请帮忙。谢谢。

x
不是“局部指针”——也就是指向局部变量的指针<代码>*x是使用
new
分配的
x
指向动态分配的内存,返回该指针就可以了。是的,编写这样的函数是可以的,书中没有错误。

返回指向局部变量的指针是错误的
x
指向堆上分配的变量:

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
}
因此,
x
没有指向局部变量


返回指向局部变量的指针是错误的原因是,该变量仅在函数处于活动状态时存在(即在输入和退出之间)。在堆上分配的变量(例如使用
new
运算符)一直存在,直到它们被释放为止(例如使用
delete
运算符)。

这是完全正确的,因为
x
的内容是在堆上分配的,而不是在堆栈上。您可能会感到困惑,因为有一个
typedef node*链接在那里,使它看起来像一个堆栈分配,因为它掩盖了
x
实际上是一个
节点*

link x=new节点(a[m])!=地方的pointer@Mysticial:学究式地说,它是一个局部指针,但并不指向局部对象:-)在
c
中,返回指向局部变量的指针会导致警告,除非您知道自己在做什么,否则可能应该避免使用,但它会起作用。不确定是<代码> C++ >代码>将它更改为错误。@ TWAI249:这不是C++中的错误。你是说C标准要求诊断吗?你对此有参考资料吗?@twain249:这很有启发性,但我不认为“我的编译器所做的证明”将被视为关于C标准的陈述:-)
x
是一个自动变量。你可能在想
*x
@KerrekSB是的,我想我的意思是“在堆上分配
x
的内容”,为了清晰起见进行了编辑。实际上,
x
的内容是一个自动变量的内容。您可能在考虑
*x
?@KerrekSB我想我们对“内容”有不同的定义,我想您的定义可能更正确。因此分配给x的内存在我们明确这样做之前不会被释放。或者我可以说,如果变量超出范围,分配给函数堆栈的内存将是未定义的;但在堆上不会吗?是的。您确实需要显式解除分配。此外,从分配堆的函数返回后,在堆上分配的变量将继续存在。
link x = new node(a[m]);