C语言学习笔记(五):内存分配

1:

void GetMemory(char **p, int num)
{
	*p = (char *)malloc(num);       //堆
}
void Test1()
{
	char *str = NULL;
	GetMemory(&str, 100);
	strcpy(str, "xmgcc");
	printf("%s\n", str);
}

输出内容:xmgcc

void Test11()
{
	char *str = NULL;
	GetMemory(str, 100);
	strcpy(str, "xmgcc");
	printf("%s\n", str);
}     

//报错的原因:GetMemory的形参是二级指针,应该把一级指针的地址作为实参传递过去

2:

char* GetMemory2()
{
	char p[] = "xmgcc";     //栈,函数返回之后,p对应的栈被系统回收
	return p;
}
void Test2()
{
	char *str = NULL;
	str = GetMemory2();
	printf("%s\n", str);
}

函数返回地址都是不安全的,因为函数结束后,函数变量的内存都会变释放,因此这个地址其他运用程序也可以用到,会被修改。
解决方法是char p[]="xmgcc"改为 static char p []="xmgcc"设为静态

3:

char *GetMemory3()
{
	char *p = malloc(100);
	return p;
}
void Test3()
{
	char *str = NULL;
	str = GetMemory3();
	strcpy(str, "xmgcc");
	printf("%s\n", str);
} 

//正确,函数申请的内存在堆上,通过变量保存函数返回所申请的内存的地址

4:

char* GetMemory4()
{
	char p[100];          //栈
	return p;				//函数申请的内存在栈上面,函数返回后,p对应的栈内存被系统回收
}
void Test4()
{
	char *str = NULL;
	str = GetMemory4();
	strcpy(str, "xmgcc");
	printf("%s\n", str);
}

//解决方法:char p[100]改为static char p[100]

5:

void Test5()
{
	char *str = (char *)malloc(100);
	strcpy(str, "xmgcc");
	free(str);                   //free之后,str指向的内存被释放,str依然指向申请的内存,也就是str的值不是NULL
	if (str != NULL) {
		strcpy(str, "welcome");
	}
	printf("%s\n", str);
}

分析错误原因:内存被释放后,不能再对内存进行操作,需要将指针置为NULL,str=NULL

6:

void GetMemory6(char *p)
{
	p = (char *)malloc(100);             //堆
	strcpy(p, "xmgcc");
}
void Test6()
{
	char *str = NULL;
	GetMemory6(str);
	printf("%s\n", str);
	free(str);
}

//解决方法:通过函数参数获取分配的内存,只能通过二级指针拿到

总结知识点:堆(malloc)是一直存在的,直到free,对应的指针依然指向该内存
栈:调用函数,由系统分配的,一般用于存放局部变量,函数参数,等等
函数调用结束,栈里的内容就被回收

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值