C语言中的二级指针做输出

一、二级指针做输入与输出

    做输入,主调函数分配内存,被调函数使用;做输出。被调函数分配内存,把运算的结果,以指针做函数参数甩出来。 

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

//求文件中的两段话的长度
//二级指针做输出,被调函数分配内存。
int GetMem(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
	char *tmp1 =NULL, *tmp2 = NULL;
	tmp1 = (char *)malloc(100);   //在堆区分配内存,并使得tmp1指向这块内存的首地址。
	if (tmp1 == NULL)
	{
		return -1;
	}
	strcpy(tmp1, "asdfghjkl");
	*mylen1 = strlen(tmp1);      //通过指针间接修改实参的值。
	*myp1 = tmp1;

	tmp2 = (char *)malloc(100);
	if (tmp2 == NULL)
	{
		return -2;
	}
	strcpy(tmp2, "11122233333");
	*mylen2 = strlen(tmp2);
	*myp2 = tmp2;				//间接修改实参p1的值

	return 0;
}

//*二级指针做参数
void FreeMem(char **myp) 
{
	char *tmp = NULL;
	if (myp == NULL)
	{
		return -1;
	}
	tmp = *myp;
	free(tmp);
	*myp = NULL;
}

//一级指针做参数
void freemem(char *myp)
{
	char *tmp = NULL;
	if (tmp == NULL)
	{
		return -1;
	}
	tmp = myp;
	free(tmp);
	myp = NULL;
}


int main()
{
	char *p1 = NULL, *p2 = NULL;
	int len1 = 0, len2 = 0;
	int ret = 0;
	ret = GetMem(&p1, &len1, &p2, &len2);
	printf("p1:%s \n", p1);
	printf("p2:%s \n", p2);
	FreeMem(&p1);
	FreeMem(&p2);
	printf("p1:%s \n", p1);
	printf("p2:%s \n", p2);
	system("pause");
	return 0;
}

 输出:

p1:asdfghjkl
p2:11122233333
p1:(null)
p2:(null)
请按任意键继续. . .

       二级指针做函数参数,实参是一个二级地址,即存放一级指针地址的内存单元的地址,因此我们可以在函数中通过二级指针去间接修改一级指针本身的值。

       如上面代码,因为我们的FreeMem()函数使用了二级指针做参数,所以可以在一级指针所指向的内UC你空间被释放掉后,可以在函数中修改实参本身的值(上面代码结果实参p1,p2在被调用函数中将值改为了NULL)

       如果我们将函数FreeMem()替换为freemem(),p1和p2的值没有被修改成功,者会出现野指针的情况,程序崩溃。

       


猜你喜欢

转载自blog.csdn.net/m0_37717595/article/details/80542488
今日推荐