本文理解借鉴为什么不可以返回局部变量的指针
首先要明确,局部变量的指针,与局部指针变量的区别
局部变量的指针,若非static,则作用域仅为函数本身,在return之后即被释放,也即指针指向一个无效变量,因此不合理
而局部指针变量则不同,尽管指针变量本身的生命期在return之后也结束,但只要其指向对象有效,其地址也是有效的
开头链接中提到例子:
//例1
int f1()
{
int x = 10;
return &x;
}
//例2
int f2(int a[],int n)
{
int p=a[0];
int i;
for(i=1;i<n;i++)
{
if(p<a[i])
p=&a[i];/p指向更大的数/
}
return p;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
例1为局部变量的指针,若仅为这一个函数,会发现输出为10看似正确,但实则为x的这部分栈空间虽所有权不归x,但也并未被占用,若在庞大的系统中,x的地址被占用,则值不为预期的,因此是错误的
而例2中,指针p指向数组a的空间,而a这部分作为实参传递,函数结束后依旧有效,因此p指向数组中的最大值,返回也依旧有效
再看几个例子:
//例3
int *f3()
{
static int x = 10;
return &x;
}
//例1
int f4()
{
int x = new int(19);
return x;
}
1
2
3
4
5
6
7
8
9
10
11
12
例3和4都是合理的,因为例3的x为静态变量,在第一次函数调用时被初始化,之后的运行过程中一直存在,因此返回其引用也合理;
而例4则是因为申请了堆上的内存,在delete之前是一直有效的,也因此要注意new或malloc的空间,一定不能忘记delete或free