Alle Ihre Beispiele erzeugen undefiniertes Laufzeitverhalten. Sie geben Zeiger oder Verweise auf Elemente zurück, die nach Ausführung aus der Funktion verschwinden.
Lassen Sie mich klarstellen:
int * returnA()
{
static int a; // The static keyword keeps the variable from disappearing.
int * j = 0; // Declare a pointer to an int and initialize to location 0.
j = &a; // j now points to a.
return j; // return the location of the static variable (evil).
}
In Ihrer Funktion die Variable j
zugeordnet ist a
‚s temporären Speicherort zu zeigen. Beim Verlassen Ihrer Funktion verschwindet die Variable a
, aber ihr früherer Standort wird über j
zurückgegeben. Da a
nicht mehr an der Position vorhanden ist, auf die j
zeigt, tritt ein undefiniertes Verhalten beim Zugriff auf *j
auf.
Variablen innerhalb von Funktionen sollten nicht durch Referenz oder Zeiger durch anderen Code geändert werden. Es kann passieren, obwohl es undefiniertes Verhalten erzeugt.
Pedantisch sollten die zurückgegebenen Zeiger so deklariert werden, dass sie auf konstante Daten zeigen. Die zurückgegebenen Referenzen sollten const sein:
const char * Hello()
{
static const char text[] = "Hello";
return text;
}
Die obige Funktion gibt einen Zeiger auf konstante Daten zurück. Anderer Code kann auf die statischen Daten zugreifen (lesen), kann jedoch nicht geändert werden.
const unsigned int& Counter()
{
static unsigned int value = 0;
value = value + 1;
return value;
}
In der obigen Funktion wird die value
auf Null auf den ersten Eintrag initialisiert. Alle folgenden Ausführungen dieser Funktion bewirken, dass value
um eins erhöht wird. Die Funktion gibt einen Verweis auf einen konstanten Wert zurück. Dies bedeutet, dass andere Funktionen den Wert (aus der Ferne) wie eine Variable verwenden können (ohne einen Zeiger dereferenzieren zu müssen).
In meinem Denken wird ein Zeiger für einen optionalen Parameter oder ein Objekt verwendet. Eine Referenz wird übergeben, wenn das Objekt existieren muss. Innerhalb der Funktion bedeutet ein referenzierter Parameter, dass der Wert existiert, jedoch muss ein Zeiger vor der Dereferenzierung auf Null überprüft werden. Mit einer Referenz gibt es auch mehr Sicherheit, dass das Zielobjekt gültig ist. Ein Zeiger könnte auf eine ungültige Adresse (nicht null) zeigen und nicht definiertes Verhalten verursachen.
Die Antworten auf diese Fragen völlig abhängig auf die Deklarationen von a, b und c, die im Code fehlen. –
Angenommen, a, b, c werden initialisiert. –
Die Variablen sind Ints. –