您好,登錄后才能下訂單哦!
1、問題:將指針數組和二維數組中的字符串存放到第三個指針所指向的內存空間中,并進行排序(默認升序)輸出,必須通過函數來完成。
(1)、代碼如下:#include<stdio.h> #include<string.h> #include<malloc.h> void destorySpace_2(char ***p3, int len3); void destorySpace_1(char **p3, int len3); int sort(char **myp1, int len1, char (*myp2)[30], int len2, char ***myp3, int *len3); int sort(char **myp1, int len1, char (*myp2)[30], int len2, char ***myp3, int *len3){ int len; int i; int j; char **p3 = NULL; int temLen; char *tmp1; len = len1 + len2; p3 = (char **)malloc(sizeof(char *) * len); //先將第一個指針數組的內容拷貝到p3所指向的空間中 for(i = 0; i < len1; i++){ temLen = strlen(myp1[i])+1; p3[i] = (char *)malloc(sizeof(char) * temLen); strcpy(p3[i], myp1[i]); } //先將第二個二維數組的內容拷貝到p3所指向的空間中 for(j = 0; j < len2; j++, i++){ temLen = strlen(myp2[j])+1; p3[i] = (char *)malloc(sizeof(char) * temLen); strcpy(p3[i], myp2[j]); } //最后對p3所指向的空間的字符串在進行排序; for(i = 0; i < len; i++){ for(j = i+1; j < len; j++){ if(strcmp(p3[i], p3[j]) > 0){ tmp1 = p3[i]; p3[i] = p3[j]; p3[j] = tmp1; } } } *myp3 = p3; *len3 = len; return 0; } //銷毀p3所指向空間的第一種方法,自己必須在調用下面對p3 = NULL; void destorySpace_1(char **p3, int len3){ int i; if(p3 != NULL){ for(i = 0; i < len3; i++){ if(p3[i] != NULL){ free(p3[i]); } } free(p3); } } //銷毀p3所指向空間的第二種方法 void destorySpace_2(char ***p3, int len3){ int i; char **p; if(p3 == NULL){ return; } p = *p3; if(p != NULL){ for(i = 0; i < len3; i++){ if(p[i] != NULL){ free(p[i]); } } free(p); *p3 = NULL; } } int main(void){ char *p1[] = {"aaaaa", "bbbbb", "ccccc", "eeeeeee"}; char buf1[][30] = {"fffff", "kkkkkkk"}; char **p3; int len1; int len2; int len3; int ret; int i; len1 = sizeof(p1)/sizeof(p1[0]); len2 = sizeof(buf1)/sizeof(buf1[0]); ret = sort(p1, len1, buf1, len2, &p3, &len3); if(ret != 0){ printf("sort() err\n"); return ret; } for(i = 0; i < len3; i++){ printf("%s\n", p3[i]); } //destorySpace_2(&p3, len3); destorySpace_1(p3, len3); p3 = NULL; return 0; }
(2)、運行結果:
(3)、模型分析
思想:因為要用函數完成,對二維數組和指針數組中的字符串先進行存放到p3所指向的空間中,就必須的使用三級指針來接收了,然后在對其所指向的空間進行排序!
在進行空間的釋放時,要是在函數內部避免野指針問題,就必須的用三級指針來接收了!
在進行空間的釋放時,要是用二級指針來接收的話,則自己必須在調用的下面對其進行賦空,避免野指針的出現,原因:2個指針空間的值沒有半毛錢的關系(它們之間僅僅是形參、實參的對應關系)!!!
拋出問題的代碼:
//函數調用 destorySpace(char **p3){ ...... p3 = NULL; } //主函數 int main(void){ char **p3 = NULL; ... destorySpace(p3); }
模型如下:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。