动态内存的传递
来源:互联网 发布:js window.scrolltop 编辑:程序博客网 时间:2024/05/18 16:37
先看如下一段代码:
#include <iostream>using namespace std ;void Getmemory(char* p ,int num){p = (char*)malloc(sizeof(char)*num) ;}int main(){char *str = NULL ;Getmemory(str,10) ;strcpy(str,"hello") ;return 0 ;}
上述代码中,Getmemory函数是有问题的,Getmemory函数体内的p实际上是main函数中的str变量在Getmemory函数栈中的一个备份,因为编译器总是为函数的每个参数制作临时的变量。因此虽然在代码第6行中p申请了堆内存,但是返回到main函数时,str还是Null,并不指向那块内存,所以代码第14行调用strcpy时会导致程序崩溃。
实际上,Getmemory并不能做任何有用的事情,这里还要注意,由于从Getmemory函数返回时不能获得堆中内存的地址,那块堆内存就不能被继续引用,也就得不到释放,因此调用一次Getmemory函数就会产生num字节的内存泄漏。
可以试着先分析下面两个代码段的输出(动态内存的传递)
程序1:
char * Getmemory(){char p[] = "hello world" ;return p ;}void test(void){char *str = NULL ;str = Getmemory() ;printf(str) ;}
程序2:
void Getmemory(char *p){p = (char *)malloc(100) ;}void test(void){char *str = NULL ;Getmemory(str) ;strcpy(str,"hello world") ;printf(str) ;}
程序1的Getmemory()返回的是指向栈内存的指针,该指针的地址不是NULL,但是当栈退出后,内容不定,有可能会输出乱码。 程序2的Getmemory()没有返回值,这个函数不能传递动态内存。在test函数中,str变量的值通过参数传值得方式赋给Getmemory()的局部变量p。但是test()中的str一直未NULL,所以第10行中的调用会使程序崩溃。此外,由于堆内存在Getmemory()执行之后没有指针引用它,因此会产生内存泄漏。
0 0
- 动态内存的传递
- 动态内存的传递
- 动态内存的传递
- 动态内存的传递
- C++函数间动态内存的传递
- 传递动态内存遇到的问题
- 解决动态内存传递不能传递的3种方法
- 动态内存传递
- 传递动态内存
- 传递动态内存
- 传递动态内存
- 传递动态内存
- 传递动态内存
- 传递动态内存
- 传递动态内存
- 指针-传递动态内存
- 动态内存传递
- 传递动态内存
- Problem G: 开个餐馆算算账
- 哥德巴赫猜想的C语言编译
- 进程与线程的一个简单解释
- 导入eclipse工程,工程以及文件显示问号
- git首次提交
- 动态内存的传递
- 转载:Questioning if Agile Works in Asia
- JavaScript 4.2 函数高级-this
- 海量数据处理(一)哈希分治
- 有关安全以及其他常用工具的词语解释
- 2.5其实他们都是“图”
- SimpleLink MCU SDK用户指南(1)
- 关于main(int argc, char* argv[])的理解
- 一个程序员的所思所想