面试---传递动态内存
2015-09-25 15:53
302 查看
这个程序测试后会有什么结果?
分析:由于void GetMemory(char * p, int num)中的 *p实际上是主函数中的一个str的一个副本,编译器总是要为函数的每个参数制作临时副本。在本例中,p申请了新的内存,只是把p所指的内存地址改变了,但str丝毫未变。因为GetMemory没有返回值,因此str并不指向p所申请的那段内存,所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会申请一块内存,但申请的内存却不能有效释放,结果是内存一直被独占,最终造成内存泄露!!!!!!
答案:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。
//—————————————————————————————————
以下是正常的申请方式:
方法一:用指针参数去申请内存时,应用采用指向指针的指针,把str的地址传给函数GetMemory
结果:
str就是字符串的值;*str是字符串中某一字符的值,默认的是首字符,所以是h;&str是字符串的地址值。
//————————————————————————————————
【内存操作及问题相关知识点】为了能彻底解决动态内存传递的问题,我们回顾一下内存管理的知识要点.
内存分配方式有三种:
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
#include <iostream.h> #include<cstring> #include<stdlib.h> using namespace std; 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> #include<cstring> #include<stdlib.h> using namespace std; void GetMemory(char **p, int num) { *p = (char *)malloc(sizeof(char) * num); } int main() { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); cout << *str <<endl; cout << str <<endl; cout << &str <<endl; return 0; }
结果:
h hello 0x28ff1c Process returned 0 (0x0) execution time : 0.241 s Press any key to continue.
str就是字符串的值;*str是字符串中某一字符的值,默认的是首字符,所以是h;&str是字符串的地址值。
//————————————————————————————————
【内存操作及问题相关知识点】为了能彻底解决动态内存传递的问题,我们回顾一下内存管理的知识要点.
内存分配方式有三种:
从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活。
在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
相关文章推荐
- PHP程序员面试 切忌急功近利(更需要注重以后的发展)
- C#常见算法面试题小结
- php 面试碰到过的问题 在此做下记录
- asp.net 面试+笔试题目第1/2页
- asp.net 面试 笔试题目[附答案]第1/3页
- 面试:(设计,架构)
- PHP中级面试经历
- 戴维营教育2015年iOS暑期班笔试面试基础考核题
- 程序员编程面试取胜的8个技巧
- PHP相关面试中最经常涉及的12个问题
- 面试时,你会问面试官哪些问题?
- asp.net面试中的四十一个经典题目
- 网络工程师面试常见问题
- 腾讯社招面试经历
- java基础面试题 - java基础(1)
- 2013阿里巴巴安全工程师实习生招聘笔试小结
- 工作流引擎面试记录及未来发展
- 3个CCIE对一个工程师的面试题
- 今天面试IBM CSDL
- 职场动态赢得面试机会的8个技巧