c語言二級指針內存模型
阿新 • • 發佈:2019-02-06
分配內存 空間 print -c 釋放 ret != oid 錯誤
第一種: 指針數組作為輸入參數
char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"};//指針數組,數組中的每個元素都是指針,
int num = 4;
void printMyArray11(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray+i) ); } }
正確地調用方法:
printMyArray11(myArray, num);
第二種 : 二級指針作輸入---內存模型(分配內存塊已知的情況)
char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"};
int num =4;
作為如下函數的實參,不能實現功能,
//錯誤調用方法:
void printMyArray02_err(char **myArray, int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray+i) ); // } }
正確調用方法:
void printMyArray02(char myArray[10][30], int num) { int i = 0; for (i=0; i<num; i++) { //printf("%s \n", myArray[i]); printf("%s \n", *(myArray+i) ); // } }
理由:指針步長不一樣,指針所指向的內存空間的數據類型不一樣。
第三種:內存模型:通過堆進行分配內存
//在主函數中進行變量的定義(如下) char ** p2 =NULL; //定義子函數 char **GetMem(int num) { int i = 0; char **p2 = NULL; p2 = (char **)malloc(sizeof(char *) * num); if (p2 == NULL) { return NULL; } for (i=0; i<num; i++) { p2[i] = (char *)malloc(sizeof(char) * 100 ); //char buf[100]; sprintf(p2[i], "%d%d%d", i+1, i+1, i+1); } return p2; } //主函數中調用 p2 = GetMem(num); //操作完之後一定要調用如下的釋放內存函數進行釋放 void GetMemFree(char **p2, int num) { int i = 0; //釋放內存 for(i=0; i<num; i++) { if (p2[i] != NULL) { free(p2[i]); p2[i] = NULL; } } if (p2!=NULL) { free(p2); } }
c語言二級指針內存模型