C++函数返回指针,为什么会这样?
C++ function returning pointer, why does this work?
可能的重复:
可以在其范围之外访问局部变量的内存吗?
所以这里有一个简单的 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++,但是对于您正在使用的编译器,它是一种自动分配形式,这意味着当您退出函数时内存不再有效。这就是为什么你会看到有趣的角色。
- 为什么函数声明中允许 const?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 为什么函数名不能与返回名类型相同?
- 为什么函数 tellg() 没有返回好的结果?
- 为什么 c++ 函数可以正确返回数组的大小?
- 为什么函数对实际参数的副本进行操作
- 为什么函数的任何索引处的下标运算符在C++中总是返回1
- 为什么函数返回不移动向量?
- 为什么函数 f4 的名称具有内部链接,而不是 C 语言链接?
- 无法确定为什么函数调用中从 char* 到 char 的无效转换
- 为什么函数返回类型中不允许参数推导?
- 为什么函数的返回类型与实际句子不一致?
- 为什么函数不在特定函数之后执行
- 为什么函数参数将带有参数的构造函数调用
- 为什么函数不是对象
- 为什么函数调用是xvalue(如果返回类型为rvalue)
- 为什么函数返回空对象
- 为什么函数的返回值不是符号名称的一部分
- 为什么函数 std::basic_streambuf::setg() 需要非常量 agruments
- 为什么函数的值为1