传递动态内存

《程序员面试宝典》

1  What will happen after running the "Test"?

#include <iostream.h>

void GetMemory(char *p, int  num)
{
    p 
= (char *)malloc(sizeof(char*
 num);
}

int
 main()
{
    
char *str =
 NULL;

    GetMemory(str, 
100
);
    strcpy(str, 
"hello"
);

    
return 0
;
}

 


分析:由于void GetMemory(char *p, int num)中的*p实际上是主函数中的一个str的一个副本,编译器总是要为函数的每个参数制作临时副本。在本倒中,p申请了新的内存,只是把p把指的内存地址改变了,但str丝毫未变。因为GetMemory没有返回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会申请一块内存,但申请的内存却不能有效释放,结果是内存一直被独占,最终造成内存泄露。

答案:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。

 

//---------------------------------------------------------------------------------------------------

 

以下是正常的申请方式:

 

方法一:用指针参数去申请内存时,应用采用指向指针的指针,把str的地址传给函数GetMemory

 

#include <iostream.h>

void GetMemory(char **p, int  num)
{
    
*= (char *)malloc(sizeof(char*
 num);
}

int
 main()
{
    
char *str =
 NULL;

    GetMemory(
&str, 100
);
    strcpy(str, 
"hello"
);

    std::cout 
<< *str <<
 std::endl;
    std::cout 
<< str <<
 std::endl;
    std::cout 
<< &str <<
 std::endl;

    
return 0
;
}

 

 

方法二:函数返回值为指针类型来传递动态内存

 

 

#include <iostream>

char *GetMemory(char *p, int num)
{
    
return p = (char *)malloc(sizeof(char*
 num);
}

int
 main()
{
    
char *str =
 NULL;

    str 
= GetMemory(str, 100
);
    strcpy(str, 
"hello"
);

    std::cout 
<< *str <<
 std::endl;
    std::cout 
<< str <<
 std::endl;
    std::cout 
<< &str <<
 std::endl;

    
return 0
;
}

 

 

  //------------------------------------------------------------------------------------------------

 What will happen after running the "Test"?


#include <iostream>

char *GetMemory(void)
{
    
char p[] = "hello world"
;
    
return
 p;
}

int
 main()
{
    
char *str =
 NULL;
    str 
=
 GetMemory();
    std::cout 
<< str <<
 std::endl;

    
return 0
;
}

答案:可能是乱码,也有可能是正常输出。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原来的内容已经被清除,新内容不可知。

 

 //------------------------------------------------------------------------------------------------

 

【内存操作及问题相关知识点】为了能彻底解决动态内存传递的问题,我们回顾一下内存管理的知识要点.
内存分配方式有三种:

 

从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。


从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活。

在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值