Longueurs de tableau dans les signatures de fonction : une anomalie déroutante
En C et C, les signatures de fonction incluent souvent des longueurs de tableau entre crochets, telles que comme dans l'exemple :
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
Cependant, cette syntaxe semble n'avoir aucun effet pratique, comme l'illustre le fait que le code ci-dessus accède avec succès aux éléments au-delà de la longueur déclarée du tableau. Cela soulève la question : pourquoi les compilateurs autorisent-ils cette notation apparemment redondante ?
La réponse réside dans les détails d'implémentation de la gestion des tableaux en C et C . Un tableau en C et C est une adresse pointant vers le premier élément du tableau. Lorsqu'un tableau est transmis à une fonction, son adresse est copiée, passant ainsi un pointeur.
Dans l'exemple ci-dessus, la fonction dis prend un tableau de caractères a avec une longueur déclarée de 1. Cependant, puisque les tableaux sont passés sous forme de pointeurs, la spécification de longueur n'est pas pertinente et la fonction peut accéder à n'importe quel élément du tableau, même si l'index dépasse la longueur déclarée.
Cette incohérence dans la syntaxe des paramètres a été un fait l’objet de débats depuis des décennies depuis son introduction aux débuts de ces langues. Alors que certains ont plaidé en faveur d'une syntaxe plus cohérente, d'autres ont cité la compatibilité avec le code existant comme raison pour maintenir le comportement actuel.
Malgré la confusion qu'elle peut provoquer, la tolérance des tableaux avec des longueurs non spécifiées dans les signatures de fonction est un sous-produit de l'implémentation basée sur des pointeurs de tableaux en C et C . Il sert à rappeler les nuances subtiles qui peuvent naître de l'interaction entre différentes caractéristiques du langage.
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!