Maison >développement back-end >C++ >Pourquoi traiter un tableau 2D comme un tableau 1D en C/C conduit-il à un comportement indéfini ?

Pourquoi traiter un tableau 2D comme un tableau 1D en C/C conduit-il à un comportement indéfini ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-15 17:48:12967parcourir

Why Does Treating a 2D Array as a 1D Array in C/C   Lead to Undefined Behavior?

Traiter un tableau 2D comme un tableau 1D : comportement non défini

En C et C, les tableaux multidimensionnels sont stockés de manière contiguë en mémoire. Cependant, l'accès à un tableau multidimensionnel à l'aide de l'indexation unidimensionnelle peut conduire à un comportement indéfini.

Considérez le code suivant :

int a[25][80];
a[0][1234] = 56; // Line 2
int* p = &a[0][0];
p[1234] = 56; // Line 4

Ligne 2 :
Ceci line tente d'accéder à un élément qui se trouve en dehors des limites du tableau a[25][80]. La première dimension de a a une taille de 25, mais la ligne 2 tente d'accéder au 1235ème élément, qui est au-delà de la plage valide. Cela entraîne un comportement indéfini car il viole la définition du langage.

Ligne 4 :
Cette ligne déclenche également un comportement indéfini. Le tableau a contient 25 * 80 = 2000 éléments, tandis que p pointe vers le début du tableau. L'expression p[1234] tente donc d'accéder au 1235ème élément du tableau, qui est en dehors de la plage valide. L'indice d'un tableau à l'aide d'un pointeur qui dépasse ses limites est considéré comme un comportement non défini.

Expressions constantes :
Le comportement non défini dans le code ci-dessus se manifeste également dans des expressions constantes. Le code suivant ne sera pas compilé en raison d'un comportement non défini :

constexpr int f(const int (&a)[2][3])
{
    auto p = &a[0][0];
    return p[3]; // Undefined behavior
}
int main()
{
    constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, };
    constexpr int i = f(a);
}

Cela démontre qu'un comportement non défini dans les expressions constantes est toujours illégal et que les compilateurs rejetteront un tel code.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn