1. 程式人生 > >C語言中的二級指標做輸出

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的值沒有被修改成功,者會出現野指標的情況,程式崩潰。