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是临时变量; 该函数如何成功返回?
char *p = new char[n]动态分配堆上的内存.这种内存的生命周期不受任何函数的约束,并且在它被解除分配(使用delete[])之前一直存在.因此,返回指向它的指针是完全有效的.
char p[n]另一方面,在堆栈上分配内存,其生命周期与定义它的函数绑定.该函数返回后,对内存的任何引用都将失效.
当您将代码更改为:
char p[n];
Run Code Online (Sandbox Code Playgroud)
...然后返回p,您将返回指向本地范围变量的指针.函数返回后,p不再存在.它的长短是因为你正在唤起未定义的行为,当你这样做时你的程序就会形成错误.