Re: [問題] 動態二維陣列的觀念問題?

看板C_and_CPP作者 (咕啾咕啾魔法陣)時間15年前 (2010/05/31 22:42), 編輯推噓7(703)
留言10則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《vaca1 (無聊人)》之銘言: : 小弟看了書 也查了很多網路的資料~ : 一般都是大同小異 也找到很多範例的code.. : 基本觀念就是要建立一個"指標的陣列" : 以下是一段範例code : int main() : { : const int sizex = 3; : const int sizey = 2; : int x, y; : int **ia = (int **)malloc(sizey * sizeof(void *) + 等於sizeof(int*) : sizey * sizex * sizeof(int *)); 多了 * : int *iax = (int*)(ia + sizex); ^^^^^ 這裡應該是sizey才對 : for(y = 0; y != sizey; ++y, iax+=sizex) : ia[y] = iax; : } 上面的code是為了把兩次malloc降成一次 等同下面的code int **ia = (int**)malloc(sizey*sizeof(int*)); int *iax = (int*)malloc(sizey*sizex*sizeof(int)); 另外我寫了一個範例 #include<stdio.h> #include<stdlib.h> int main() { const int sizex = 3; const int sizey = 2; int x, y; int **ia = (int **)malloc(sizey * sizeof(int*) + //這裡sizeof(int *)等於8(這結果隨電腦而異) sizey * sizex * sizeof(int)); int *iax = (int*)(ia + sizey); for(y = 0; y != sizey; ++y, iax+=sizex) ia[y] = iax; /* for是在建立開頭的index 如果沒做的話 這時的ia[y]沒初始化 &ia[y][x]會是不合法的address(把值印出來就知道了) 執行下去就會出錯 執行for以前的記憶體 執行for以後的記憶體(這裡的iax是指之前的iax) ia ia ↓ ↓ ----- ----- int * int *=iax &ia[0] ----- ----- int * int *=iax+3 &ia[1] ----- ----- int ←iax int=10 ←iax &ia[2] ----- ----- int int ----- ----- int int &ia[3]跳過上一格是因為sizeof(int *)=8 ----- ----- int int ←iax+3 ----- ----- int int=11 &ia[4] ----- ----- int int ----- ----- */ ia[0][0]=10; printf("%d=%d=%d\n",*(ia[0]),ia[2],ia[0][0]); ia[1][1]=11; printf("%d=%d=%d\n",*(ia[1]+1),ia[4],ia[1][1]); free(ia); /*正確輸出: 10=10=10 11=11=11 */ } --------------------------------------------------- 如果在sizeof(int *)=4的環境要怎麼改 可以嘗試一下 ~ ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.134.226.149

05/31 23:42, , 1F
寫的清楚好懂了!建議在學習陣列的時候畫表格理解
05/31 23:42, 1F

05/31 23:55, , 2F
同意樓上 畫畫圖可以幫助理解
05/31 23:55, 2F
※ 編輯: loveflames 來自: 140.134.226.149 (06/01 02:20)

06/01 11:21, , 3F
咦.我用CB,ia[6]才會是10,4是sizeof(int*) = 8的關係?
06/01 11:21, 3F

06/01 11:22, , 4F
&ia[3]跳過上一格是因為sizeof(int *)=8 不太懂.囧"
06/01 11:22, 4F

06/01 11:51, , 5F
因為每一格都差4
06/01 11:51, 5F

06/01 14:16, , 6F
OTL...理解不能..
06/01 14:16, 6F

06/01 14:18, , 7F
把&ia[x]印出來看吧
06/01 14:18, 7F

06/01 14:36, , 8F
喔喔..突然間了解了
06/01 14:36, 8F

06/01 15:33, , 9F
感謝你非常詳細的解說!
06/01 15:33, 9F

06/02 10:36, , 10F
說的很詳細,給推一下
06/02 10:36, 10F
文章代碼(AID): #1C0yhJuB (C_and_CPP)
文章代碼(AID): #1C0yhJuB (C_and_CPP)