2

我是objective-c的新手,并且正在做一些暂时有效的事情,但我担心有一天会坏掉。

在我的一个对象中,我将一个整数矩阵声明为实例变量。由于我还不知道矩阵的大小,所以我这样声明:

int **_matrix;

稍后在代码中,当我知道矩阵的行数和列数时,我将其初始化如下:

_matrix = malloc(sizeof(*_matrix) * columns * lines);
for (i = 0; i < columns; i++) {
    _matrix[i] = malloc(sizeof(int) * lines);
    for(j = 0; j < lines; j++)
        _matrix[i][j] = -1;
}

假设我的分配是正确的(如果它实际上是错误的,请随时告诉我),我可以自信地使用二维数组语法访问元素吗?

我之所以问,是因为根据我的阅读,当您创建一个实际的二维数组时,内存会连续保留,但使用双指针可能并非如此。所以我害怕打电话

_matrix[i][j]

实际上会指向内存中的一个随机位置(而不是我分配的位置)。

谢谢您的回答!

4

1 回答 1

1

是的,它是安全的。的确,堆栈上的二维数组通常是连续分配的,但您不必担心这一点。重要的是括号一次被评估一对,而不是作为一些特殊的[][]运算符,并且括号取消引用指针。所以它会取消引用你的第一个指针,然后它会取消引用第一次取消引用产生的“行”指针。

更多信息:数组访问和指针取消引用是等效的。表达式x[y]等价于*(x+y)。因此,您的代码首先取消引用指针 value (matrix + i),从而为您提供另一个指针值(因为您有一个指针数组)。在此之后,您的代码取消引用指针(matrix[i] + j)并将其分配值 -1。如您所见,这正是您想要它做的事情。

于 2013-02-19T00:08:10.493 回答