1

有没有办法分两步声明一个二维整数数组?我的范围有问题。这就是我想要做的:

//I know Java, so this is an example of what I am trying to replicate:

int Array[][];
Array = new int[10][10];

现在,在 OBJ-C 中,我想做类似的事情,但我无法正确使用语法。现在我一步一步完成了它,但我不能在我目前拥有它的 If 语句之外使用它:

int Array[10][10]; //This is based on an example I found online, but I need 
                   //to define the size on a seperate line than the allocation

谁能帮我解决这个问题?我知道这可能是一个更基本的问题,但是您不能在消息之外使用关键字“new”(据我所知),并且您不能将消息发送到整数。:(

*编辑1:**

我的问题与范围有关。

//Declare Array Somehow
Array[][] //i know this isn't valid, but I need it without size

//if statement
if(condition)
Array[1][2]
else
Array[3][4]

//I need to access it outside of those IFs

//... later in code
Array[0][0] = 5;
4

2 回答 2

4

如果您知道其中一个边界的大小,这是我创建二维数组的首选方式:

int (*myArray)[dim2];

myArray = calloc(dim1, sizeof(*myArray));

并且可以一键释放:

free(myArray);

不幸的是,必须修复其中一个界限才能使其正常工作。

但是,如果您不知道任何一个边界,这也应该有效:

static inline int **create2dArray(int w, int h)
{
    size_t size = sizeof(int) * 2 + w * sizeof(int *);
    int **arr = malloc(size);
    int *sizes = (int *) arr;
    sizes[0] = w;
    sizes[1] = h; 
    arr = (int **) (sizes + 2);

    for (int i = 0; i < w; i++)
    {
        arr[i] = calloc(h, sizeof(**arr));
    }

    return arr;
}

static inline void free2dArray(int **arr)
{
     int *sizes = (int *) arr;
     int w = sizes[-2];
     int h = sizes[-1];

     for (int i = 0; i < w; i++)
         free(arr[i]);

     free(&sizes[-2]);
}
于 2012-05-07T16:26:09.797 回答
0

您显示的声明(例如int Array[10][10];)是可以的,并且对于声明它的范围有效,如果您在类范围内执行,那么它将对整个类有效。

如果数组的大小不同,要么使用动态分配(例如malloc和朋友),要么使用NSMutableArray(对于非原始数据类型)

于 2012-05-07T16:21:01.877 回答