2 votes

Accès aux éléments des pointeurs doubles en utilisant la syntaxe des tableaux à 2 dimensions en Objective-C

Je suis nouveau dans le domaine de l'objectif-c et je fais quelque chose qui fonctionne pour le moment, mais j'ai peur que cela ne se brise un jour.

Dans un de mes objets, je déclare une matrice d'entiers comme variable d'instance. Comme je ne connais pas encore la taille de la matrice, je l'ai déclarée comme ceci :

int **_matrix;

Plus tard dans le code, lorsque je connais le nombre de lignes et de colonnes de ma matrice, je l'initialise comme ceci :

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

En supposant que mon allocation est correcte (n'hésitez pas à me dire si elle est erronée), puis-je accéder en toute confiance aux éléments en utilisant la syntaxe des tableaux à deux dimensions ?

Je pose la question parce que, d'après ce que j'ai lu, lorsque vous créez un tableau à deux dimensions, la mémoire est réservée en permanence, mais ce n'est peut-être pas le cas lorsque vous utilisez des pointeurs doubles. Je crains donc que l'appel à

_matrix[i][j]

pointerait en fait vers un endroit aléatoire de la mémoire (et non vers l'endroit que j'ai alloué).

Merci pour vos réponses !

1voto

Chuck Points 138930

Oui, c'est sûr. Il est vrai que les tableaux bidimensionnels sur la pile sont généralement alloués de manière contiguë, mais vous n'avez pas à vous en soucier. L'important est que les parenthèses soient évaluées une paire à la fois, et non pas comme une sorte de [][] et les parenthèses déréférencent les pointeurs. Ainsi, il déréférencera votre premier pointeur, puis il déréférencera le pointeur "row" qui a été cédé par la première déréférence.

Plus d'informations : Les accès aux tableaux et les déréférencements de pointeurs sont équivalents. L'expression x[y] est équivalent à *(x+y) . Donc votre code déréférence d'abord la valeur du pointeur (matrix + i) ce qui vous donne une autre valeur de pointeur (puisque vous aviez un tableau de pointeurs). Après cela, votre code déréférence le pointeur (matrix[i] + j) et lui attribue la valeur -1. Comme vous pouvez le voir, c'est précisément ce que vous voulez qu'il fasse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X