作者loveflames (咕啾咕啾魔法陣)
看板C_and_CPP
標題Re: [問題] 動態二維陣列的觀念問題?
時間Mon May 31 22:42:25 2010
※ 引述《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
推 diabloevagto:寫的清楚好懂了!建議在學習陣列的時候畫表格理解 05/31 23:42
推 christianSK:同意樓上 畫畫圖可以幫助理解 05/31 23:55
※ 編輯: loveflames 來自: 140.134.226.149 (06/01 02:20)
推 ilovebbs:咦.我用CB,ia[6]才會是10,4是sizeof(int*) = 8的關係? 06/01 11:21
→ ilovebbs:&ia[3]跳過上一格是因為sizeof(int *)=8 不太懂.囧" 06/01 11:22
→ loveflames:因為每一格都差4 06/01 11:51
推 ilovebbs:OTL...理解不能.. 06/01 14:16
→ loveflames:把&ia[x]印出來看吧 06/01 14:18
推 ilovebbs:喔喔..突然間了解了 06/01 14:36
推 vaca1:感謝你非常詳細的解說! 06/01 15:33
推 hichcock:說的很詳細,給推一下 06/02 10:36