Die Segmentierungsfehler treten auf, wenn Sie versuchen, auf nicht ausgelagerten Speicherblock zuzugreifen. Es ist ein undefiniertes Verhalten für den Zugriff auf nicht initialisierte Zeiger, und auch der Zugriff auf Speicher mit nicht initialisierten Index ist undefiniert^2.
Undefiniertes Verhalten kann zu Segmentierungsfehlern führen, kann zu Datenverlust führen, kann dazu führen, dass Papa Noel aus Ihrem Terminal kommt !! oder .... Aber in den meisten Fällen führen speicherbezogene undefinierte Verhaltensprobleme zu Segmentierungsfehlern oder ähnlichen Problemen, aber warum erhalten Sie keinen Segmentierungsfehler, bis Sie den Dereferenzierungsindex erwähnt haben?
Dies liegt daran, dass Sie das Zeiger-Array nicht initialisiert haben. Der im Speicher gespeicherte Wert, den das Array belegt hat, wird nicht geändert. Es ist total durch Ihre Chance, dass diese Variable eine Adresse enthält, die auf den virtuellen Speicher Ihrer Anwendungen ausgelagert wird. Wenn Sie ihn mit Null initialisieren oder statisch machen oder als globale Variable definieren, erhalten Sie definitiv einen Segmentierungsfehler bei der ersten Dereferenzierung.
Einige Beispiele:
Manuelle Initialisierung auf NULL (Null)
{
int * ptr = NULL;
int index;
*ptr = 1; // segfault
*ptr[index] = 1; // may not segfault, based on uninitialized value stored in index
}
Statische Variablen
{
static int * ptr; // static variable (default initialized to 0)
*ptr = 1; // segfault
}
Globale Variablen werden initialisiert automatisch automatisch initialisiert werden, wird auch
int * ptr; // global variable (default initialized to 0)
{
*ptr = 1; // segfault
}
Lokale Speichergrößen im Stapel sind nicht initialisierten und den Wert auf das Gedächtnis behalten unberührt besetzt
{
int * ptr; // unintialized
*ptr = 1; // may segfault or may not
}
Undefiniertes Verhalten ist .................. Undefiniert .......... Unvorhersehbar ......... – LPs
_Ich würde dies erwarten Code zu segfault auf der zweiten Iteration _... und warum nicht zum ersten Mal? O_o – LPs
Was ist hier nicht definiert? Der Zugriff auf eine nicht deklarierte Erinnerung? Ist das in der C-Spezifikation geschrieben? –