可能重复:
Can a local variable’s memory be accessed outside its scope?
所以这是一个简单的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是临时变量;该函数如何成功返回?
答案 0 :(得分:8)
char *p = new char[n]
在堆上动态分配内存。这种内存的生命周期不受任何函数的约束,并且在它被释放之前一直存在(使用delete[]
)。因此,返回指向它的指针是完全有效的。
char p[n]
在堆栈上分配内存,其生命周期与定义它的函数绑定。该函数返回后,对内存的任何引用都将失效。
答案 1 :(得分:7)
将代码更改为:
char p[n];
...然后返回p
,您将返回指向本地范围变量的指针。函数返回后,p
不再存在。它的长短是因为你引起了未定义的行为,当你这样做时你的程序就会形成错误。
答案 2 :(得分:1)
因为new char[n]
会alloc
在堆上占用内存(以后不要忘记delete[]
)
而char p[n];
是一个静态数组,驻留在堆栈上,在函数返回后自动重用
如果从函数返回对它的引用,则返回指向内存不足的指针并引用未使用的内存是库存标准的未定义行为
答案 3 :(得分:1)
这是动态分配和内存自动分配之间的区别。 char * p = new char[n];
是动态分配,这意味着在您删除内存之前内存仍然有效。另一方面,char p[n];
严格来说不是合法的C ++,但是使用它的编译器是一种自动分配形式,这意味着退出函数时内存不再有效。这就是你看到有趣角色的原因。