Pointeur vers un tableau 2D avec une longueur de ligne incompatible

J’ai essayé le code suivant

char arr[5] = {'A', 'E', 'I', 'O', 'U'}; char (*p_arr)[1] = &arr; printf("%c\n", p_arr[0][4]); //returns 'U' 

Pourquoi n’y a-t-il pas d’erreur, puisque

  char (*p_arr)[1] = &arr; 

semble être une initialisation d’un type incompatible ( char (*)[5] au lieu de requirejs char (*)[1] )? De plus, p_arr[0][4] demande le 5ème élément d’un tableau censé ne comporter qu’un seul élément. N’est-ce pas faux?

Votre compilateur est cassé / mal configuré / non conforme.

Un pointeur de tableau sur un tableau avec 1 élément n’est pas compatible avec un pointeur de tableau sur un tableau de 5 éléments. La règle d’ assignation simple en C dit qu’une affectation de pointeur valide doit être (C11 6.5.16.1 emphase mine):

  • l’opérande gauche a un type de pointeur atomique, qualifié ou non qualifié, et (compte tenu du type que l’opérande gauche aurait après la conversion de lvalue), les deux opérandes sont des pointeurs vers des versions qualifiées ou non qualifiées de types compatibles, et le type pointé vers la gauche a les qualificatifs du type indiqué par la droite;

Si nous supprimons tous les termes standard formels du texte cité, nous nous retrouvons avec ceci en clair:

L’opérande gauche de l’opérateur = a un type de pointeur et les deux opérandes sont des pointeurs sur des types compatibles.

Ce n’est pas le cas dans votre code. Il contient donc un élément appelé violation de contrainte , ce qui signifie que le code enfreint les règles permises par le standard C.