如何动态分配结构的2D数组?

时间:2010-06-22 14:55:39

标签: c objective-c arrays

维度在编译时是未知的,所以我试图动态分配2D结构数组。代码编译但访问元素时访问不正确。

// 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

4 个答案:

答案 0 :(得分:6)

C只有1D数组,因此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]
    

答案 1 :(得分:5)

代码应该大致如下:

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

记得释放他们。

答案 2 :(得分: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类才能使其工作。

答案 3 :(得分:0)

分配背后的概念是错误的。

假设x是你的第二个维度(在你的例子中是[20])而y是你的第一个维度(在你的例子中是[10]),y元素只是指向x数组的指针。从概念上讲,你会这样做

D'oh',yehnan打败了我。