C語言中的二級指標做輸出
阿新 • • 發佈:2019-01-28
一、二級指標做輸入與輸出
做輸入,主調函式分配記憶體,被調函式使用;做輸出。被調函式分配記憶體,把運算的結果,以指標做函式引數甩出來。
#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的值沒有被修改成功,者會出現野指標的情況,程式崩潰。