利用函数申请内存的几个问题
2012-04-12 11:24
190 查看
#include<stdio.h> #include <iostream> using namespace std; void GetMemory1(char *p) { p = (char *)malloc(100); } void Test1(void) { char *str = NULL; GetMemory1(str); strcpy(str, "hello world"); //报内存错误,此时str仍然是空 printf(str); } void GetMemory2(char **p, int num)//用二重指针是正确的 { *p = (char *)malloc(num); } void Test2(void) { char *str = NULL; GetMemory2(&str, 100); strcpy(str, "hello"); printf(str);//输出hello但是有内存泄漏 } char *GetMemory3(void) { char p[] = "hello world"; //p[]存在于栈里边.函数结束后释放 return p; } void Test3(void) { char *str = NULL; str = GetMemory3(); printf(str); //输出不可预测,因为GetMemory 返回的是指向“栈内存”的指针, //该指针的地址不是 NULL ,但其原现的内容已经被清除,新内容不可知。 } char *GetMemory4(void) { char *p = "hello world"; //存放在字符串常量区,程序结束后才释放 return p; } void Test4(void) { char *str = NULL; str = GetMemory4(); printf(str); //输出hello world } void Test5(void) { char *str = (char *) malloc(100); strcpy(str, "hello"); free(str); if(str != NULL) { strcpy(str, "world"); printf(str); //输出world。free后成了野指针 } } void main() { Test5(); }
Test5为什么输出world不是很明白。
以上的程序涉及到C++中变量的存储位置和有效期
1、栈区:由系统进行内存管理,用于存储函数的参数值、局部变量,函数结束后释放。
2、堆区:由程序员分配和释放,new、malloc
3、全局区、静态区:存放全局变量和静态变量。
4、字符串常量区:用于存放字符串常量,程序结束后由系统释放。
本文出自 “菜鸟变身记” 博客,请务必保留此出处http://buptdtt.blog.51cto.com/2369962/832201
相关文章推荐
- 利用函数申请内存的几个问题
- 通过函数给指针申请内存时遇到的内存泄漏问题
- 关于用函数指针参数申请动态内存的问题
- 关于库函数里申请的内存空间在库函数外释放的问题的一些总结
- Linux的内存结构以及动态申请的几个函数
- C语言中常用的几个内存申请函数
- // 在利用子函数实现内存堆分配的实现时出现的问题,同时也需要利用子函数实现内存堆的释放。
- c中函数返回局部变量申请的内存的问题
- 内核的几个内存动态申请函数
- Linux下利用信号量函数和共享内存函数和C语言实现生产者消费者问题
- c语言第二周总结-程序存储区划分/动态申请内存/内存操作函数
- C语言中内存的申请函数
- 利用内存读写函数和自定义消息实现进程间通信
- 最近在SPARK上定位的几个内存泄露问题总结
- C++数组作为函数参数的几个问题
- 《IOS_C语言》程序存储区划分、动态申请内存、内存操作函数
- 问题,值得研究 申请内存不释放没有问题
- stm32 BOOTLOADER 导出函数给APP调用出现malloc无法分配内存的问题
- 利用JProfiler对应用服务器内存泄漏问题诊断一例(转)
- dll的内存申请和释放问题--Debug程序正常而Release程序崩溃