Manuel de suivi dynamique Solaris

Relation entre pointeur et ensemble

Les pointeurs et ensembles entretiennent une relation spéciale dans D, tout comme dans ANSI-C. Un ensemble est représenté par une variable associée à l'adresse de son premier emplacement de stockage. Un pointeur représente également l'adresse d'un emplacement de stockage d'un type défini. D permet donc d'utiliser la notation d'index d'ensemble [ ] avec des variables de pointeur et des variables d'ensemble. Par exemple, les deux fragments D suivants ont une signification équivalente :

p = &a[0];				trace(a[2]);
trace(p[2]);

Dans le fragment de gauche, le pointeur p est affecté à l'adresse du premier élément de l'ensemble dans a en appliquant l'opérateur & à l'expression a[0]. L'expression p[2] suit la valeur du troisième élément (index 2) de l'ensemble. p contenant désormais la même adresse associée à a, cette expression donne la même valeur que a[2], tel qu'illustré dans le fragment de droite. Une conséquence de cette équivalence est que C et D vous permettent d'accéder à tout index de tout pointeur ou ensemble. La vérification des liaisons d'ensemble n'est pas exécutée par le compilateur ou l'environnement d'exécution DTrace pour vous. Si vous accédez à la mémoire après la fin d'une valeur prédéfinie d'un ensemble, vous obtiendrez un résultat inattendu ou DTrace signalera une erreur d'adresse non valide, tel qu'illustré dans l'exemple précédent. Comme toujours, vous ne pouvez pas détériorer DTrace ou le système d'exploitation, mais vous devrez déboguer le programme D.

La différence entre les pointeurs et les ensembles est telle qu'une variable de pointeur fait référence à un stockage distinct contenant l'adresse d'entier d'un autre stockage. Un variable d'ensemble nomme le stockage de l'ensemble, et non l'emplacement d'un entier contenant à son tour l'emplacement de l'ensemble. Cette différence est illustrée dans le diagramme suivant :

Figure 5–2 Stockage de pointeur et d'ensemble

Le diagramme illustre le pointeur d'un ensemble de cinq objets.

Cette différence est représentée dans la syntaxe D si vous tentez d'affecter des pointeurs et des ensembles scalaires. Si x et y sont des variables de pointeur, l'expression x = y est légale. Elle copie simplement l'adresse de pointeur dans y vers l'emplacement de stockage nommé par x. Si x et y sont des variables d'ensemble scalaire, l'expression x = y n'est pas légale. Des ensembles peuvent ne pas être intégralement affectés dans D. Cependant, une variable d'ensemble ou un nom de symbole peut être utilisé au cas où un pointeur serait autorisé. Si p est un pointeur et que a est un ensemble, l'instruction p = a est autorisée. Celle-ci équivaut à l'instruction p = &a[0].