Array-Längen in Funktionssignaturen: Eine verwirrende Anomalie
In C und C enthalten Funktionssignaturen häufig Array-Längen in eckigen Klammern, z wie im Beispiel:
int dis(char a[1]) { int length = strlen(a); char c = a[2]; return length; }
Diese Syntax scheint jedoch keine praktische Wirkung zu haben, wie das Beispiel zeigt Tatsache ist, dass der obige Code erfolgreich auf Elemente zugreift, die über die deklarierte Länge des Arrays hinausgehen. Dies wirft die Frage auf: Warum erlauben Compiler diese scheinbar redundante Notation?
Die Antwort liegt in den Implementierungsdetails der Array-Verarbeitung in C und C. Ein Array in C und C ist eine Adresse, die auf das erste Element des Arrays zeigt. Wenn ein Array an eine Funktion übergeben wird, wird seine Adresse kopiert, wodurch effektiv ein Zeiger übergeben wird.
Im obigen Beispiel akzeptiert die Funktion dis ein Array von Zeichen a mit der deklarierten Länge 1. Allerdings seit Arrays werden als Zeiger übergeben, die Längenangabe ist irrelevant und die Funktion kann auf jedes Element des Arrays zugreifen, auch wenn der Index die deklarierte Länge überschreitet.
Diese Inkonsistenz in der Parametersyntax wurde behoben Seit seiner Einführung in den Anfängen dieser Sprachen war es jahrzehntelang Gegenstand von Debatten. Während einige für eine konsistentere Syntax plädierten, nannten andere die Kompatibilität mit Legacy-Code als Grund für die Beibehaltung des aktuellen Verhaltens.
Trotz der Verwirrung, die es verursachen kann, ist die Toleranz von Arrays mit nicht spezifizierten Längen in Funktionssignaturen ein Nebenprodukt der zeigerbasierten Implementierung von Arrays in C und C . Es dient als Erinnerung an die subtilen Nuancen, die durch das Zusammenspiel verschiedener Sprachmerkmale entstehen können.
Das obige ist der detaillierte Inhalt vonWarum erlauben C- und C-Funktionssignaturen Array-Längen, die keine Auswirkung haben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!