Ich habe in einem älteren Projekt folgenden Code gesehen.
%Vor% Ich bestand darauf, analyse.c
so zu ändern, dass die Deklaration wie folgt enthalten ist:
Ich möchte v2
, weil pointer to T
nicht dasselbe ist wie array of T
. Der Zähler meines Freundes hat erklärt, dass das Verhalten von beiden gleich ist, also ist es egal, ob ich v1 und v2 verwende.
Frage 1: Wird ein unvollständiges Array für einen Zeiger benötigt?
Frage 2: Stimmt mein Freund, dass beide Versionen garantiert gleichwertig sind?
Also würden in Ihrer analyse.c
folgende Anweisungen mit dieser Deklaration erzeugt werden.
%Vor%
extern struct token id_tokens[];
id_token [i]
a. Adresse von id_tokens, die möglicherweise von einer anderen Kompilierungseinheit verknüpft sind wird genommen b. Offset von i wird hinzugefügt
c. Wert ist referenziert
In Ihrem analyse.c
würden folgende Anweisungen mit dieser Deklaration generiert:
extern struct token *id_tokens;
id_token [i]
a. Inhalt von Adresse von id_tokens, die von anderen verknüpft ist Kompiliereinheit ist vergeben.
(Führt zu einem Kompilierungsfehler, wenn er in der gleichen Kompilierungseinheit aufgrund von Typenkonflikten vorhanden ist)
b. Offset von i wird hinzugefügt
c. Wert ist referenziert
Nehmen wir an, sizeof id_token[0]
ist 2
byte und Größe des Zeigers to id_token[0]
ist 4
byte.
Ihre spätere Erklärung kann die id_tokens[0]
& amp; id_tokens[1]
als Adresse und fügen Sie einen Offset hinzu (der eine existierende oder nicht existierende Adresse, eine ausgerichtete oder nicht ausgerichtete Adresse sein kann, die es weiß).
Wenn es Ihr guter Tag ist, kann das Programm sofort abstürzen oder segfault und Sie erhalten eine Chance, den Fehler zu beheben. Wenn es Ihr schlechter Tag ist, kann Programm mit etwas anderem Speicher gerade durcheinander bringen oder einen falschen Zustand zu irgendeinem Modul mitteilen, das in der Schwierigkeit führen kann, Fehler zu verfolgen und einen Albtraum zu verursachen.
Nun, ich denke, Sie verstehen, warum Sie (nil)
als Ausgabe in Mr. 32 Antwort .
Die erste Version ist falsch. Arrays sind keine Zeiger, die Deklaration extern struct token *id_tokens;
stimmt nicht mit dem Definitionstyp struct token id_tokens[MAX_TOKENS];
überein.
Referenz: C FAQ: Ich hatte die Definition char a [6] in einer Quelldatei, und in einem anderen habe ich extern erklärt char * a. Warum hat es nicht funktioniert? . Siehe auch dies .
lässt das gleiche durch das Programm verstehen
test.c
%Vor%head.h
%Vor%test1.c mit v1
%Vor%Ausgabe: In der Originaldatei: 0x601040In einer anderen Datei (nil)
test1.c mit v2
%Vor%Ausgabe: In der Originaldatei: 0x601040In der anderen Datei 0x601040
Dies zeigt deutlich, dass v1 nicht korrekt ist und v2 korrekt ist.
Tags und Links c language-lawyer declaration extern