Maison >développement back-end >C++ >Pourquoi les longueurs de tableau dans les signatures de fonctions C/C sont-elles ignorées par le compilateur ?

Pourquoi les longueurs de tableau dans les signatures de fonctions C/C sont-elles ignorées par le compilateur ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-22 16:28:15547parcourir

Why Are Array Lengths in C/C   Function Signatures Ignored by the Compiler?

Longueurs de tableau dans les signatures de fonctions C/C : une anomalie déroutante

En C et C, les signatures de fonction peuvent inclure des longueurs de tableau entre crochets, telles que int a[ 1]. Cependant, ce comportement a intrigué les développeurs, car les longueurs semblent n'avoir aucun effet pratique.

Considérons l'exemple suivant :

#include <iostream>

int dis(char a[1]) {
    int length = strlen(a);
    char c = a[2];
    return length;
}

int main() {
    char b[4] = "abc";
    int c = dis(b);
    cout << c;
    return 0;
}

Dans ce code, la fonction dis déclare un paramètre de tableau avec une longueur de 1 (a[1]), mais accéder à a[2] est toujours possible. Cela soulève la question : pourquoi les compilateurs autorisent-ils les longueurs de tableau dans les signatures de fonction si elles ne sont pas appliquées ?

La vérité derrière l'anomalie

La réponse réside dans le comportement unique du passage de tableau en C/ C. Contrairement à de nombreux autres langages, C et C ne permettent pas le passage direct de tableaux aux fonctions. Au lieu de cela, un pointeur vers le premier élément du tableau est passé.

Par conséquent, la longueur du tableau spécifiée dans la signature de la fonction n'a plus d'importance. Les informations de longueur ne sont pas incluses dans le pointeur, donc le compilateur ignore simplement la longueur entre parenthèses.

Ce comportement découle d'une décision prise au cours des premières étapes du développement du C dans les années 1970. Bien qu'elle ait semé la confusion au fil des ans, la syntaxe reste répandue en C et en C.

Implications pour les développeurs

Cette bizarrerie du passage de tableaux a plusieurs implications :

  • Les longueurs des tableaux dans les signatures de fonctions doivent être ignorées car elles n'ont aucun impact sur le comportement du code.
  • Les tableaux peuvent être déclarés comme des pointeurs (par exemple, char *a) pour éviter cette ambiguïté.
  • Lors du passage de tableaux à des fonctions, il est crucial de s'assurer que les indices du tableau restent dans les limites, car les informations de longueur ne sont pas disponibles dans la signature de la fonction.

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