C 如何动态分配结构的二维数组?
维度在编译时是未知的,所以我尝试动态分配一个2D结构数组。代码可以编译,但在访问元素时,我的访问权限不好C 如何动态分配结构的二维数组?,c,objective-c,arrays,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 NSIntege
// 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
代码大致如下所示:
grid = (GridNode **) malloc(sizeof(GridNode *) * nx);
int i;
for(i = 0; i < nx; i++) {
grid[i] = (GridNode *) malloc(sizeof(GridNode) * ny);
}
grid=(GridNode**)malloc(sizeof(GridNode*)*nx);
int i;
对于(i=0;i
记住释放它们。你的分配背后的概念是错误的 假设x是第二维度(示例中为[20]),y是第一维度(示例中为[10]),则y元素只是指向x数组的指针。所以从概念上讲,你会这样做
D'oh',yehnan抢先一步。C只有1D数组,所以2D数组可以用两种方式定义:
GridNode**grid
,因此要被grid[x][y]
访问,但您必须分别初始化每一行(右,因为yehnan首先要初始化):
一个更简单的选择是创建一个一维
NSArray
或NSMutableArray
,并使用一点数学来访问正确的行和列:
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类才能工作。nx和ny的值是多少?你确定它们是你想要的吗?我测试时nx和ny都是128。谢谢,我现在看到了错误。在这种情况下,我如何释放它们?
NSUInteger index = (row - 1) * width + col;
[array insertObject:myNode atIndex:index];
NSUInteger index = (row - 1) * width + col;
[array objectAtIndex:index];