Maison >développement back-end >C++ >L'accès à un élément de tableau 2D à l'aide de l'arithmétique du pointeur au-delà de ses limites entraîne-t-il un comportement indéfini ?
Un tableau 2D peut-il être traité comme un tableau 1D concaténé ?
Considérez l'extrait de code suivant :
int a[25][80]; a[0][1234] = 56; int* p = &a[0][0]; p[1234] = 56;
Question :Le code accède-t-il au tableau au-delà de ses limites, entraînant un comportement indéfini ?
Réponse : Oui, les lignes 2 et 4 présentent un comportement indéfini.
En C , l'indexation de tableaux est essentiellement une arithmétique de pointeur. Lors de l’accès à a[i][j], le compilateur le traduit effectivement en *(a[i] j). De même, p[i] fait référence à *(p i).
Dans ce cas, le tableau a a des dimensions de 25 x 80. La première ligne du tableau, a[0], contient 80 éléments (allant de a[0][0] à a[0][79]) et est alloué à un emplacement mémoire contigu.
En accédant à a[0][1234], le code tente de accéder à un élément à l'index 1234 dans la première ligne, bien que a[0] ne contienne que des éléments dans la plage [0, 79]. Ceci est hors limites et déclenche un comportement non défini.
La même logique s'applique à la ligne 4. Alors que p pointe vers le premier élément de a[0], le tableau est toujours dimensionné à 25 x 80. Accéder à p[ 1234] est essentiellement une opération arithmétique de pointeur hors limites, conduisant une fois de plus à un comportement indéfini.
De plus, comme l'a souligné Language Lawyer dans les commentaires, un extrait de code similaire utilisant un constexpr ne pourrait pas être compilé car le compilateur détecte de tels comportements non définis dans une expression constante :
constexpr int f(const int (&a)[2][3]) { auto p = &a[0][0]; return p[3]; } int main() { constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, }; constexpr int i = f(a); }
Ceci se compile correctement car l'accès à p[3] à l'aide d'un constexpr déclenche le compilateur pour détecter le comportement non défini et générer une erreur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!