2010-06-22 126 views
3

尺寸在編譯時是未知的,所以我試圖動態地分配一個二維的結構數組。代碼編譯但訪問元素時訪問錯誤。如何動態分配結構的二維數組?

// The struct 
typedef struct 
{ 
    NSInteger numActors; 
    Actor *a1; 
    Actor *a2; 
    Actor *a3; 
    Actor *a4; 
    Actor *a5; 
} GridNode; 

// In interface 
GridNode **grid; 

// In init 
NSInteger nx = inFrame.size.width/blockSize; 
NSInteger ny = inFrame.size.height/blockSize; 
grid = malloc(sizeof(GridNode) * nx * ny); 
grid[10][20].numActors = 3; // EXC_BAD_ACCESS 
+0

nx和ny的值是什麼?你確定他們是你想要他們的嗎? – WildCrustacean 2010-06-22 14:59:57

+0

當我測試時,nx和ny都是128。 – Morrowless 2010-06-22 15:01:08

回答

5

大致代碼應該是這樣的:

grid = (GridNode **) malloc(sizeof(GridNode *) * nx); 
int i; 
for(i = 0; i < nx; i++) { 
    grid[i] = (GridNode *) malloc(sizeof(GridNode) * ny); 
} 

記住釋放他們。

+0

謝謝,我現在看到了錯誤。 – Morrowless 2010-06-22 15:11:20

0

您的分配背後的概念是錯誤的。

假設x是你的第二維(在你的例子中是[20]),y是你的第一維(在你的例子中是[10]),y元素只是指向x數組的指針。所以從概念上來說,你會做

D'oh',yehnan擊敗了我。

6

C具有僅一維數組,所以2D那些可以通過兩種方式來定義:

  1. 作爲數組的數組,像GridNode **grid,所以要由grid[x][y]訪問,但是那麼你必須初始化每個分開(右,如yehnan設法anwser第一)行:

    grid=malloc(sizeof(GridNode*)*nx); 
    for(int e=0;e<nx;e++) grid[e]=malloc(sizeof(GridNode)*ny); 
    
  2. 與棘手索引一維數組:

    grid=malloc(sizeof(GridNode)*nx*ny); 
    grid[(10-1)*nx+20] //grid[10,20] 
    
+0

希望我也能接受。 – Morrowless 2010-06-22 15:13:22

1

一個簡單的替代方法是創建一個單維NSArrayNSMutableArray,並使用一些數學訪問正確的行和列:

NSUInteger width = 10; 
NSUInteger height = 10; 
NSUInteger size = width * height; 
NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:size]; 

要在第5行,第3列插入GridNode ,你可以這樣做:

NSUInteger index = (row - 1) * width + col; 
[array insertObject:myNode atIndex:index]; 

爲了取回排節點2列6,你會怎麼做:

NSUInteger index = (row - 1) * width + col; 
[array objectAtIndex:index]; 

計算機中的內存具有單一維度。我們從C熟悉的多維地址實際上就是執行類似於上面所示的操作的語法糖。

我可以想到的唯一警告是,您可能必須將GridNode從C結構轉換爲Objective-C類才能工作。