Heim >Backend-Entwicklung >C++ >Warum ignorieren C- und C-Compiler Array-Längen in Funktionssignaturen?

Warum ignorieren C- und C-Compiler Array-Längen in Funktionssignaturen?

Barbara Streisand
Barbara StreisandOriginal
2024-12-29 14:59:15265Durchsuche

Why Do C and C   Compilers Ignore Array Lengths in Function Signatures?

Arrays in Funktionssignaturen: Eine merkwürdige Anomalie in C und C

In C und C werden Array-Längen üblicherweise in Funktionssignaturen angegeben mit die Syntax int a[size]. Es kommt jedoch zu einem merkwürdigen Verhalten, wenn diese Längen nicht erzwungen werden.

Der mysteriöse Fall von dis(char a[1])

Bedenken Sie den folgenden Codeausschnitt:

#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;
}

In diesem Beispiel deklariert die Funktion dis einen Array-Parameter a der Größe 1. Das Programm greift jedoch auf Elemente über dieser Größe zu ohne Compilerfehler. Dies wirft die Frage auf: Warum erlauben Compiler Array-Längen in Funktionssignaturen, wenn sie nicht erzwungen werden?

Eine eigenartige Sprachfunktion

Die Antwort liegt in der Art und Weise, wie C und C-Handle-Arrays in Funktionsaufrufen. In Wirklichkeit können Arrays nicht direkt an Funktionen übergeben werden. Stattdessen wird ein Zeiger auf das erste Element des Arrays übergeben, der keine Informationen über die Länge des Arrays enthält.

Daher wird die in der Funktionssignatur angegebene Größe (in diesem Fall [1]) vom Compiler ignoriert . Diese Entscheidung stammt aus den 1970er Jahren und hat zu erheblicher Verwirrung unter Entwicklern geführt.

Auswirkungen auf die Programmierung

Diese Eigenart hat mehrere Auswirkungen:

  • Fehlende Überprüfung erzwungener Grenzen:Arrays in C und C fehlen integrierte Grenzprüfung, daher liegt es in der Verantwortung des Programmierers sicherzustellen, dass Array-Indizes die Array-Größe nicht überschreiten.
  • Potenzielle Sicherheitslücken: Falsche Array-Nutzung kann zu Pufferüberläufen führen, u. a Art der Sicherheitslücke.
  • Eingeschränktes Verständnis: Das Fehlen von Durchsetzung Array-Längen können es schwierig machen, den Zweck und die Einschränkungen von Funktionsparametern zu verstehen.

Obwohl dieses Verhalten rätselhaft erscheinen mag, ist es ein fester Bestandteil der Programmiersprachen C und C. Das Verständnis seiner Auswirkungen ist für eine sichere und effiziente Codeentwicklung von entscheidender Bedeutung.

Das obige ist der detaillierte Inhalt vonWarum ignorieren C- und C-Compiler Array-Längen in Funktionssignaturen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn