内存处理一段测试代码

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void GetMem(char *p,int n)
{
	p=(char*)malloc(n);//空间不得释放  内存泄露
}

char *GetMem2(char *p,int n)
{
	p=(char*)malloc(n);
	return p;//返回指针
}
void test()
{
	char *p=NULL;
	#ifdef __TEST
	GetMem(p,100);// 出错
	#else
	p=GetMem2(p,100);	//不出错
	#endif
	assert(p!=NULL);
	printf("%s\n",p);
}

int main()
{
	test();
	return 0;
}
/*毛病出在函数 GetMem 中。编译器总是要为函数的每个参数制作临时副本,指针
参数 p 的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p 的内容,就导致
参数 p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p 申请
了新的内存,只是把_p 所指的内存地址改变了,但是 p 丝毫未变。所以函数 GetMem
并不能输出任何东西。事实上,每执行一次 GetMemory 就会泄露一块内存,因为没有用
free 释放内存。如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”
*/

posted @ 2015-11-05 19:25  cloudren2020  阅读(108)  评论(0编辑  收藏  举报