Re: [問題] 動態二維陣列的觀念問題?
※ 引述《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
06/01 11:21, 3F
→
06/01 11:22, , 4F
06/01 11:22, 4F
→
06/01 11:51, , 5F
06/01 11:51, 5F
推
06/01 14:16, , 6F
06/01 14:16, 6F
→
06/01 14:18, , 7F
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):