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
Libérer: 2024-12-15 17:48:12
original
966 Les gens l'ont consulté

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
Copier après la connexion

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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal