Un tableau 2D peut-il être traité comme un tableau 1D contigu ?
L'abonnement en C entraîne l'ajout de pointeurs suivi d'une indirection. Considérez le code suivant :
int a[25][80]; a[0][1234] = 56; int* p = &a[0][0]; p[1234] = 56;
La deuxième ligne appelle-t-elle un comportement indéfini ? Qu'en est-il de la quatrième ligne ?
Réponse :
Les deux lignes entraînent un comportement indéfini.
Selon le C standard, l'ajout d'un pointeur à un élément du tableau entraîne un comportement valide uniquement si l'index résultant se trouve dans les limites du tableau. Dans ce cas, a[0] a une taille de 80 et les indices en dehors de cette plage ne sont pas définis.
Explication :
L'indice équivaut à ce qui suit :
a[0][1234] == *(a[0] + 1234)
Puisque a[0] pointe vers le premier élément de la première ligne de a, l'ajout du pointeur a[0] 1234 tente d'accéder à un élément au-delà de la fin de la ligne. Cela entraîne un comportement indéfini.
De même, la quatrième ligne tente de modifier une valeur en dehors des limites de la ligne :
p[1234] == *(p + 1234)
Même si p pointe vers le premier élément de a, en essayant modifier un élément au-delà des limites de sa ligne sous-jacente entraîne un comportement indéfini.
Il est important de noter que ce type de comportement indéfini n'est pas détecté par le compilateur. Par conséquent, il est essentiel de garantir que les opérations arithmétiques des pointeurs restent dans les limites des éléments de tableau valides pendant l'exécution.
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!