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

Mor*_*ess 6 c arrays objective-c

在编译时维度是未知的,所以我试图动态分配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
Run Code Online (Sandbox Code Playgroud)

mbq*_*mbq 7

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);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 作为具有棘手索引的一维数组:

    grid=malloc(sizeof(GridNode)*nx*ny);  
    grid[(10-1)*nx+20] //grid[10,20]
    
    Run Code Online (Sandbox Code Playgroud)


yeh*_*nan 6

代码应该大致如下:

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

并记得释放他们.