C++函数返回指针,为什么会这样?

C++ function returning pointer, why does this work?

本文关键字:为什么 函数 返回 指针 C++      更新时间:2023-10-16

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

所以这里有一个简单的 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++] = '';
}
return p ;
}

这很好用,但是如果我char * p = new char[n];更改为char p[n];,我会看到有趣的角色。会发生什么?前者有什么区别?此外,p 是一个临时变量;函数如何成功返回它?

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

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

当您将代码更改为:

char p[n];

。然后返回p,您将返回指向局部范围变量的指针。 函数返回后,p不再存在。 它的长短是你正在唤起未定义的行为,当你这样做时,你的程序是格式不正确的。

因为new char[n]alloc会消耗堆上的内存(不要忘记稍后delete[]它)

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

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

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