In diese Frage Ich bin völlig verwirrt über diesen scheinbar grundlegenden Aspekt von C. Betrachten Sie diese zwei Codezeilen:
%Vor%gcc gibt die folgenden Warnungen aus:
%Vor% Für welchen Typ ist ptr
voreingestellt, int
oder int*
(wie in ptr
ein Zeiger oder int
)? Wenn ja, bedeutet das, dass ptr
auf Adresse 2 zeigt, oder ist das unverändert? Ich würde annehmen, dass es sich geändert hat, weil es abstürzt, es sei denn, Sie geben ptr
eine gültige Adresse an.
Ich bin mir der Möglichkeit eines undefinierten Verhaltens bewusst und dass Sie Warnungen nicht ignorieren sollten, aber ich versuche zu sehen, was hier wirklich passiert.
Informationen zum Kontext finden Sie in der Kommentarkette unter dieser Antwort .
Hier ist Folgendes: Da die zwei Zeilen, die Sie anzeigen, im Dateibereich liegen (im Gegensatz zu einem lokalen Bereich), werden beide Zeilen als Deklarationen behandelt, nicht als Deklaration und als Zuweisungsanweisung. Dies liegt daran, dass im Dateibereich keine Anweisungen vorhanden sein können - nur Deklarationen und Definitionen sind zulässig.
Alte C-Regeln erlaubten Deklarationen vom Typ int
, um den Typ ganz wegzulassen. Daher ist die zweite Zeile
ptr
int
, weil der Typ fehlt. Diese letzte Regel ist sehr archaisch und wurde in der ANSI-Version des Sprachstandards abgelehnt. Deshalb erhalten Sie eine Warnung. Wenn Sie Ihren Code in
ändern %Vor%Dein Code wird kompiliert und ausgeführt ( Demo ).
Nun bleibt noch eine Frage: Wie kommt es, dass der Compiler nicht über doppelte Deklarationen klagt? Es stellt sich heraus, dass der Compiler mehrere identische Deklarationen als ein und dasselbe behandelt, solange sie vollständig identisch sind.
Tags und Links c