Est-ce que ce qui suit est bien défini, pour des valeurs différentes de REF
?Déréférencement d'un pointeur hors limite contenant l'adresse d'un objet (tableau de tableau)
#include <stdio.h>
#define REF 1
#define S 1
int main(void) {
int a[2][S] = {{1},{2}};
int *q = REF ? a[1] : 0;
int *p = a[0] + S;
memcpy (&q, &p, sizeof q);
printf ("q[0] = %d\n", q[0]);
return 0;
}
Notez que p
des points à l'après le dernier élément de a[0]
, et non à un élément du tableau a[0]
, donc pas dereferenceable. Mais l'adresse stockée dans p
est l'adresse de a[1][0]
. p
points sémantiquement (intentionnellement?) "À" (bien, sur) a[0]
mais pointe physiquement dans a[1]
.
Une copie du modèle binaire d'un pointeur peut-elle être sémantiquement dirigée vers un objet lorsque l'original le fait physiquement?
VOIR AUSSI
J'ai demandé essentiellement la même question C/C++ avec un autre "angle":
- Are pointer variables just integers with some operators or are they "mystical"?
- Is memcpy of a pointer the same as assignment?
- Overwriting an object with an object of same type (C++ uniquement)
a n'est pas vraiment un tableau de tableaux, c'est un tableau qui a un accès bidimensionnel. La mémoire dans ce cas sera allouée comme un bloc et sera traitée en interne comme un bloc unidimensionnel. –
@SamiKuhmonen Donc vous dites qu'il n'y a pas de tableau lié, tant que je reste dans le bloc? Donc 'a [0] [1]' va bien? – curiousguy
Je ne dirais pas que c'est bien, car il est encore sémantiquement, mais avec un pointeur brut, vous pouvez accéder à la mémoire consécutivement. Essayer de trouver un auteur doc poêle sur cette allocation –