Tableaux dans les signatures de fonctions : une curieuse anomalie en C et C
En C et C, les longueurs de tableaux sont généralement spécifiées dans les signatures de fonctions en utilisant la syntaxe int a[size]. Cependant, un comportement curieux se produit lorsque ces longueurs ne sont pas appliquées.
Le cas mystérieux de dis(char a[1])
Considérez l'extrait de code suivant :
#include <iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; // Attempt to access element beyond specified length return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
Dans cet exemple, la fonction dis déclare un paramètre de tableau a de taille 1. Cependant, le programme accède aux éléments au-delà de cette taille sans aucune erreur du compilateur. 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 ?
Une fonctionnalité de langage originale
La réponse réside dans la manière dont C et C gère les tableaux dans les appels de fonction. En réalité, les tableaux ne peuvent pas être transmis directement aux fonctions. Au lieu de cela, un pointeur vers le premier élément du tableau est passé, ne contenant aucune information sur la longueur du tableau.
Par conséquent, la taille spécifiée dans la signature de la fonction ([1] dans ce cas) est ignorée par le compilateur. . Cette décision remonte aux années 1970 et a conduit à une confusion importante parmi les développeurs.
Implications pour la programmation
Cette bizarrerie a plusieurs implications :
Bien que ce comportement puisse sembler déroutant, il fait partie inhérente des langages de programmation C et C. Comprendre ses implications est crucial pour un développement de code sûr et efficace.
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!