传智播客 C/C++学习笔记 二级指针作为输出参数以及空间的释放

 

二级指针

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	int a = 10;
	int *p = &a;
	int **pp = &p;

	printf("&a : %p\n", &a);
	printf("p : %p\n", p);
	printf("&p: %p\n", &p);
	printf("pp: %p\n", pp);
	printf("&pp: %p\n", &pp);
	printf("*p: %d\n", *p);
	printf("*pp:%p\n", *pp);
	printf("**pp:%d\n", **pp);

	return 0;
}
#define  _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


//二级指针作为输出参数
//在函数内部 在堆上开辟空间  传出去。
int get_mem(/*out */char **mem1, int *mem_len1, char **mem2, int *mem_len2)
{
	char *temp_p1 = NULL;
	char *temp_p2 = NULL;
	int len1 = 0;
	int len2 = 0;

	if (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL) {
		fprintf(stderr, " (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL) \n");
		return -1;
	}

	temp_p1 = (char *)malloc(4096);
	if (temp_p1 == NULL) {
		return -1;
	}
	memset(temp_p1, 0, 4096);

	strcpy(temp_p1, "12345678");
	len1 = strlen(temp_p1);

	temp_p2 = (char*)malloc(4096);
	if (temp_p2 == NULL) {
		return -1;
	}
	memset(temp_p2, 0, 4096);

	strcpy(temp_p2, "abcdefg");
	len2 = strlen(temp_p2);


	//以上开辟完空间

	*mem1 = temp_p1;
	*mem2 = temp_p2;
	*mem_len1 = len1;
	*mem_len2 = len2;

	return 0;
}

void free_mem(char **mem1, char **mem2)
{
	char *temp_mem1 = *mem1;
	char *temp_mem2 = *mem2;

	if (mem1 != NULL) {
		free(temp_mem1);
	}
	if (mem2 != NULL) {
		free(temp_mem2);
	}

	*mem1 = NULL;
	*mem2 = NULL;
}


int envalue(char** myStr1, char** myStr2, char** myStr3)
{
	char* temp1 = (char*)malloc(200);
	strcpy(temp1, "燕子来时新社,梨花落后清明。池上碧苔三四点,叶底黄鹂一两声。");
	*myStr1 = temp1;

	//char* temp2 = (char*)malloc(sizeof(char) * 100);
	char* temp2 = (char*)malloc(200);
	memset(temp2, 0, 200);
	char* temp3 = "巧笑东邻女伴,采桑径里逢迎。疑怪昨宵春梦好,元是今朝斗草赢。笑从双脸生。";
	strcpy(temp2, "巧笑东邻女伴,采桑径里逢迎。疑怪昨宵春梦好,元是今朝斗草赢。笑从双脸生。");
	*myStr2 = temp2;

	*myStr3 = "hello Yanshu"; //变量和空间都 在静态区最后系统回收

	return 0;

}

void free_envalue(char** mystr1)
{

	if (mystr1 == NULL)
	{
		return;
	}
	//delete *mystr1;
	free(*mystr1);
	*mystr1 = NULL;


	//char*  tem = NULL;
	//if (mystr1 == NULL)
	//{
	//	return;
	//}
	//tem = *mystr1;
	//free(tem);
	//*mystr1 = NULL;
	return;
}

//在被调用函数中把p1所指向的内存释放掉,但是实参p1不能被修改成NULL,有野指针现象
void free_envalue1(char* mystr1)
{

	if (mystr1 == NULL)
	{
		return;
	}
	delete mystr1;
	mystr1 = NULL;
	return;
}

void free_envalue2(char** mystr1)
{
	//*mystr1表示什么呢?
	if (*mystr1 == NULL)
	{
		return;
	}
	//delete *mystr1;
	free(*mystr1);
	*mystr1 = NULL;

	//char*  tem = NULL;
	//if (mystr1 == NULL)
	//{
	//	return;
	//}
	//tem = *mystr1;
	//free(tem);
	//*mystr1 = NULL;
	return;
}

int main(void)
{

	char *buf1 = NULL;
	char *buf2 = NULL;
	int len1 = 0;
	int len2 = 0;

	if (get_mem(&buf1, &len1, &buf2, &len2) < 0) {
		return -1;
	}

	printf("buf1: %s, buf2:%s\n", buf1, buf2);
	free_mem(&buf1, &buf2);


	char *pome1 = NULL;
	char *pome2 = NULL;
	char *pome3 = NULL;

	envalue(&pome1, &pome2, &pome3);
	printf("%s\n", pome1);
	printf("%s\n", pome2);
	printf("%s\n", pome3);

	free_envalue(&pome1);
	//free_envalue1(pome1);p1不能被修改成NULL,有野指针现象, thus free room will be wrong!
	free_envalue2(&pome2);

	//begin free room 
	if (pome1 != NULL)
	{
		free(pome1);
		pome1 = NULL;
	}

	if (pome2 != NULL)
	{
		free(pome2);
		pome2 = NULL;
	}
	//end free room 

	system("pause");
	return 0;
}

不知为什么用malloc时没错,但用new 分配空间后释放空间就出错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值