1. 程式人生 > >二維陣列的動態申請

二維陣列的動態申請


  我看出了他的malloc錯了,我的想法是總共有6*30個char所以我寫了如下程式碼:
從這裡可以看出我對於二維陣列的理解是連續的一塊記憶體,我以為二維陣列跟一維陣列一樣是連續的,把記憶體的首地址給這個二級指標就可以正常使用了,但是我錯了。經過一系列的討論和驗證終於理清了二維陣列的結構,實際上二維陣列可以看成是由若干個一維陣列組成的,這其實大家都可以理解,關鍵是二維陣列的外層還有一個數組,他所儲存的是下面那些一維陣列的首地址,故二維陣列需要的空間就不止sizeof(char)*3*30了,還要包含三個指標sizeof(char *)*3;還有一個需要注意的地方是,雖然我們申請了這些空間但是他們仍然是毫無關聯的一些記憶體塊,要想將二級指標像二維陣列名一樣使用我們還得將指標和一維陣列關聯起來這樣才能夠正常使用。所以二維陣列的動態分配第一步是分配記憶體,第二步是關聯指標。需要說明的一點是二維陣列拷貝也要分級拷貝。下面是一種二維陣列的動態分配的方法,供大家參考: #include <stdio.h> #include <stdlib.h>                      #include <string.h> void function(char ** ptr)               {     char arr[3][30] =  {         "abc",         "def",         "ghi"     };     int i = 0;     for(i = 0; i < 3; i++)         memcpy(ptr[i], arr[i], sizeof(char)*30); } int main() {     int i = 0;     int j = 0;     //printf("hello word\n");     char **ptr = NULL;     ptr = (char **)malloc(sizeof(char *)*3);     for(i = 0; i < 3; i++)         *(ptr+i) = (char *)malloc(sizeof(char)*30);     function(ptr); #if 1     for(i  = 0; i < 3; i++)         printf(" %s \n", ptr[i]); #endif     for(i = 0; i < 3; i++)         free(ptr[i]);     return 0; } 二維陣列雖然我們說他是不連續的空間。但是如果你願意也可以嘗試如下做法,將二維陣列變成一個連續的記憶體塊,但是其原理沒有變仍然需要將指標和一維陣列關聯,只不過認為的將記憶體挪到了一起。程式碼如下:

歡迎加入C語言交流群 461097775