Es gibt mehrere gute Antworten auf diese Frage, von denen angenommen wurde. Ich werde trotzdem antworten, um die praktischen Aspekte zu erweitern.
Ja, es ist eine gute Vorgehensweise, Zeiger auf NULL zu initialisieren, sowie Zeiger auf NULL zu setzen, nachdem sie nicht mehr benötigt werden (d. H. Freigegeben).
In jedem Fall ist es sehr praktisch, in der Lage zu sein, einen Zeiger vor der Dereferenzierung zu testen. Nehmen wir an Sie eine Struktur haben, die wie folgt aussieht:
struct foo {
int counter;
unsigned char ch;
char *context;
};
Sie dann eine Anwendung schreiben, die mehrere Threads laicht, die alle auf einer zugewiesenen foo Struktur betreiben (sicher) durch die Verwendung der gegenseitigen Ausgrenzung.
Thread A erhält eine Sperre auf foo, erhöht Zähler und prüft auf einen Wert in ch.Es findet keinen, also wird der Kontext nicht zugeordnet (oder geändert). Stattdessen speichert es einen Wert in ch, so dass Thread B diese Arbeit stattdessen ausführen kann.
Thread B Sieht, dass der Zähler inkrementiert wurde, notiert einen Wert in ch, ist sich aber nicht sicher, ob Thread A irgendetwas mit Kontext getan hat. Wenn Kontext als NULL initialisiert wurde, muss sich Thread B nicht länger darum kümmern, was Thread A getan hat, er weiß, dass der Kontext sicher ist, um zu dereferenzieren (wenn nicht NULL) oder zuzuweisen (wenn NULL), ohne zu lecken.
Thread B erledigt sein Geschäft, Thread A liest seinen Kontext, gibt ihn frei und initialisiert ihn dann auf NULL.
Die gleiche Argumentation gilt für globale Variablen ohne die Verwendung von Threads. Es ist gut, sie in verschiedenen Funktionen testen zu können, bevor Sie sie dereferenzieren (oder versuchen, sie zuzuweisen, was zu einem Leck und einem undefinierten Verhalten in Ihrem Programm führt).
Wenn es albern ist, wenn der Umfang des Zeigers nicht über eine einzige Funktion hinausgeht. Wenn Sie eine einzelne Funktion haben und die Zeiger darin nicht verfolgen können, bedeutet das normalerweise, dass die Funktion neu berechnet werden sollte. Es ist jedoch nichts falsch daran, einen Zeiger in einer einzigen Funktion zu initialisieren, und sei es nur, um einheitliche Gewohnheiten beizubehalten.
Das einzige Mal, dass ich ein ‚hässlich‘ Fall von unter Berufung auf eine initialisierte Zeiger in (vor und nach dem Gebrauch) so etwas wie dies gesehen haben:
void my_free(void **p)
{
if (*p != NULL) {
free(*p);
*p = NULL;
}
}
ist nicht nur dereferencing eine Art Zeiger punned auf strengen Plattformen verpönt, macht der obige Code frei() sogar noch gefährlicher, weil Anrufer eine Täuschung der Sicherheit haben werden. Sie können sich nicht auf eine "Großhandels" -Praxis verlassen, es sei denn, Sie sind sich sicher, dass jede Operation damit einverstanden ist.
Wahrscheinlich viel mehr Informationen, als Sie eigentlich wollten.
Was ist Ihre Frage? –
Ich denke, er fragt, ob er diese "Zeichenkette" auf NULL (oder 0), auf "" initialisieren oder gar nicht initialisieren soll. –
Einige Vorsicht hier gebraucht wird, NULL ist _usually_ 0, aber nach der Norm es anders sein könnte: 'Das Makro NULL, in jeder definiert, , , , , oder , ist eine Implementierung definiert C++ Nullzeigerkonstante in diesem Internationalen Standard'. Ich würde definitiv bei NULL bleiben, außerdem ist es "typorientierter" und beschreibender im Quellcode als 0. –
RedGlyph