Warum funktioniert ein C Programm nur mit 'gcc -O1' -> 'gcc -O' aber nicht mit gcc -O0?
-
Hi Leute,
ich habe hier ein C Programm das einbandfrei mit den gcc -O1 bis gcc -O3
funktioniert aber mit gcc -O0 bekomme ich eine Fehlermeldung.Hier ist das Programm:
#include <stdio.h> #include <sys/time.h> #include <string.h> #include <errno.h> int main(int argc, char *argv[]) { struct timeval *tv; char *err_string; if(gettimeofday(tv, NULL) == 0) { printf("sec = %d, msec = %d\n", tv->tv_sec, tv->tv_usec); return 0; } else { err_string = strerror(errno); printf("Error message = %s\n", err_string); return 255; } }
Die Fehlermeldung ist mit gcc -O0 main.c:
a.out
Error message = Bad addressKann mir das jemand erklären?
Danke,
Frodus
-
Du hast Glück, dass das überhaupt irgendwie funktioniert. Dein Zeiger timeval ist nicht initialisiert, der zeigt irgendwo in den Speicher.
-
Die Erklärung für solche Probleme ist immer die gleiche: Du hast einen Fehler in Deinem Programm, welcher undefiniertes Verhalten hervorruft. Dieses undefinierte Verhalten tritt bei unterschiedlichen Optimierungsstufen unterschiedlich auf.
In Deinem Fall verwendest Du einen nicht initialisierten Zeiger tv. So wird es richtig:
#include <stdio.h> #include <sys/time.h> #include <string.h> #include <errno.h> int main(int argc, char *argv[]) { struct timeval tv; char *err_string; if(gettimeofday(&tv, NULL) == 0) { printf("sec = %d, msec = %d\n", tv.tv_sec, tv.tv_usec); return 0; } else { err_string = strerror(errno); printf("Error message = %s\n", err_string); return 255; } }
-
Super Danke!
-
MFK schrieb:
Du hast Glück, dass das überhaupt irgendwie funktioniert. Dein Zeiger timeval ist nicht initialisiert, der zeigt irgendwo in den Speicher.
Eigentlich ist das eher Pech, wenn es funktioniert. Uninitialisierte Zeiger, die zufälligerweise doch funktionieren und nur unter einigen Umständen zum Absturz führen, können einen Programmierer zur Verzweiflung bringen.
-
Stimmt, "Glück" ist das falsche Wort. Glück hat man, wenn einem so etwas um die Ohren fliegt.