面试官写了一段程序:
void fun(int* a) { a = new int[100]; cout << a << endl; } int main() { int *a; fun(a); a[1]= 0; fun(a); }
这个程序有问题吗?
答: 有问题。
面试官:那需要怎么改:
答:
void fun(int* &a) { a = new int[100]; cout << a << endl; } int main() { int *a; fun(a); a[1]= 0; fun(a); }
面试官:OK,那如果不修改,会报什么问题。答:
先分析分析,函数内的变量在作用域内有效,作用域外无效。运行完,变量都会释放,变量所占的空间也会被收回。
比如:
int* fun1() { int a = 10; return &a; } int main() { int * a = fun1(); cout << *a << endl; }
编译的时候会报错:警告:返回了局部变量的‘a’的地址但是能返回 内部变量a的结果:10。这是为什么呢?
那我们再看一个例子:
#include<stdio.h> #include<iostream> using namespace std; int* fun1() { int a = 10; return &a; } int fun2() { int b = 11; return b; } int main() { int * a = fun1(); fun2(); cout << *a << endl; }
编译:
g++ 1.cpp -o 1
1.cpp: In function ‘int* fun1()’:
1.cpp:14: 警告:返回了局部变量的‘a’的地址执行:
./1
结果为:
11
为什么变成11呢。
那我们可以很好解释了,函数fun1运行完后变量释放,空间被系统收回了,只是变量执行的内存数据没变,在里面取数据还能取到之前a的值10.
运行fun2后,空间被变量b使用了,并赋值为11, 所以最后返回结果为11.
变量的问题解决了,那指针变量怎么释放呢,
来看个例子:
#include<stdio.h> #include<iostream> using namespace std; void fun(int* a) { a = new int[100]; cout << a << endl; } int main() { int *a; cout << a << endl; fun(a); cout << a << endl; }
运行结果为:0
0x1cfb010
0
在没运行fun函数前, 指针a为NULL,运行过程中函数内,指针分配了空间,并且有空间地址的值。函数运行完后指针又赋为NULL。
所以指针变量释放,会变成空,而指向的空间不会释放(并且程序运行完也不会释放,久而久之会使内存空间越来越少)。