C++函数返回指针,为什么这个工作?

Nas*_*ail 3 c++ memory pointers

可能重复:
可以在其范围之外访问局部变量的内存吗?

这是一个简单的c ++函数.它的作用是将一个字符数组作为其参数和一个整数n,然后创建一个只包含n个数组元素的新字符数组.

char * cutString(char * ch , int n){

  char * p = new char[n];
  int i ;
  for(i = 0 ; i < n ; i++)
         p[i] = ch[i];
  while(i <= n ){
    p[i++] = '\0';
  }
  return p ;

}
Run Code Online (Sandbox Code Playgroud)

这很好,但如果我改变char * p = new char[n];,char p[n];我会看到有趣的人物.怎么了?前者有什么不同?另外,p是临时变量; 该函数如何成功返回?

Rei*_*ica 8

char *p = new char[n]动态分配堆上的内存.这种内存的生命周期不受任何函数的约束,并且在它被解除分配(使用delete[])之前一直存在.因此,返回指向它的指针是完全有效的.

char p[n]另一方面,在堆栈上分配内存,其生命周期与定义它的函数绑定.该函数返回后,对内存的任何引用都将失效.


Joh*_*ing 7

当您将代码更改为:

char p[n];
Run Code Online (Sandbox Code Playgroud)

...然后返回p,您将返回指向本地范围变量的指针.函数返回后,p不再存在.它的长短是因为你正在唤起未定义的行为,当你这样做时你的程序就会形成错误.