Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何动态分配结构的二维数组?_C_Objective C_Arrays - Fatal编程技术网

C 如何动态分配结构的二维数组?

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

维度在编译时是未知的,所以我尝试动态分配一个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

代码大致如下所示:

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];