3

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

所以这是一个简单的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 ;

}

这工作得很好,但如果我改变char * p = new char[n];我会char p[n];看到有趣的角色。怎么了?前者有什么区别?另外,p 是一个临时变量;函数如何成功返回?

4

4 回答 4

9

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

char p[n]另一方面,在stack上分配内存,其生命周期绑定到定义它的函数。一旦该函数返回,对内存的任何引用都将变为无效。

于 2012-11-09T16:09:47.127 回答
7

当您将代码更改为:

char p[n];

...然后 return p,您将返回一个指向本地范围变量的指针。函数返回后,p不再存在。总而言之,您正在唤起未定义的行为,而当您这样做时,您的程序格式不正确。

于 2012-11-09T16:09:33.057 回答
1

因为new char[n]alloc在堆上吃掉内存(以后别忘了delete[]

而是char p[n];一个静态数组,它驻留在堆栈上,在函数返回后自动重用

如果从函数返回对它的引用,则返回指向 unues 内存的指针,并且引用未使用的内存是标准的未定义行为

于 2012-11-09T16:10:26.437 回答
1

这是动态分配和自动分配内存之间的区别。char * p = new char[n];是动态分配,这意味着内存在您删除之前一直有效。另一方面,char p[n];严格来说是不合法的 C++,但是对于您使用的编译器,它是一种自动分配的形式,这意味着当您退出函数时内存不再有效。这就是为什么你会看到有趣的角色。

于 2012-11-09T16:10:43.650 回答