2

私はobjective-cが初めてで、今のところうまくいくことをやっていますが、いつか壊れるのではないかと心配しています。

オブジェクトの 1 つで、整数の行列をインスタンス変数として宣言します。行列のサイズはまだわからないので、次のように宣言しました。

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

私の割り当てが正しいと仮定すると (実際に間違っているかどうか教えてください)、2 次元配列構文を使用して要素に自信を持ってアクセスできますか?

私が読んだことから、実際の2次元配列を作成すると、メモリは継続的に予約されますが、ダブルポインターを使用するとそうではない可能性があるためです。したがって、私は電話することを恐れています

_matrix[i][j]

実際にはメモリ内のランダムな場所を指します(私が割り当てた場所ではありません)。

回答ありがとうございます。

4

1 に答える 1

1

はい、安全です。スタック上の 2 次元配列が連続して割り当てられるのは事実ですが、それについて心配する必要はありません。重要なことは、ブラケットが特別な[][]演算子としてではなく、一度に 1 対ずつ評価され、ブラケットがポインターを逆参照することです。したがって、最初のポインターを逆参照し、最初の逆参照によって生成された「行」ポインターを逆参照します。

詳細: 配列アクセスとポインター逆参照は同等です。式x[y]は と同等*(x+y)です。したがって、コードは最初にポインター値(matrix + i)を逆参照します。これにより、別のポインター値が得られます (ポインターの配列があるため)。この後、コードはポインターを逆参照し(matrix[i] + j)、値 -1 を割り当てます。ご覧のとおり、これはまさにあなたがやりたいことです。

于 2013-02-19T00:08:10.493 に答える