返回对动态生成的二维数组的引用

return reference to dynamically generated 2D array

本文关键字:二维数组 引用 动态 返回      更新时间:2023-10-16
//header file
CGPoint **positions;
//Implementation file
int rows = 10;
int columns = 6;
positions = malloc(rows * sizeof(CGPoint));
for(int i=0; i<rows; i++){
    positions[i] = malloc(columns * sizeof(CGPoint));
}
positions[0][0] = CGPointMake(682, 0);
positions[0][1] = CGPointMake(682, 336);
positions[0][2] = CGPointMake(0, 0);
positions[0][3] = CGPointMake(-341, 336);
positions[0][4] = CGPointMake(0, 336);
positions[0][5] = CGPointMake(341, 0);
positions[1][0] = CGPointMake(341, 0);
positions[1][1] = CGPointMake(341, 336);
positions[1][2] = CGPointMake(682, 336);
positions[1][3] = CGPointMake(-341, 336);
positions[1][4] = CGPointMake(0, 336);
positions[1][5] = CGPointMake(0, 0);
//and so on..

我需要帮助编写以下函数,将返回像这样的位置的随机第二维。返回完整的子数组位置[0]或位置[1],

- (CGPoint *)point {
    return positions[arc4random() % rows];
}
    你应该分配指针大小而不是结构大小。
  • CGPointMake(x, y)在堆栈而不是堆中创建结构。感谢@Bavarious指出这不是真的。请看下面的评论。:)

做你想做的事的代码:

unsigned int row = 10;
unsigned int column = 10;
CGPoint **points = malloc(row * sizeof(CGPoint *));
for (int r = 0; r < row; ++r) {
    points[r] = malloc(column * sizeof(CGPoint));
    for (int c = 0; c < column; ++c) {
        points[r][c].x = 0.0;
        points[r][c].y = 0.0;
    }
}

警告:当你不再需要2D数组时,你必须记住释放它。一种方法是将其包装在Obj-C包装器中,并在initdealloc中这样做。