44. 腾讯面试题: 使用函数的参数指针,分配内存空间问题

面试官写了一段程序:

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。


所以指针变量释放,会变成空,而指向的空间不会释放(并且程序运行完也不会释放,久而久之会使内存空间越来越少)。



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值