Entweder hab ich Tomaten auf den Augen oder aber der GCC-Compiler macht nicht was er soll.
Folgendes Problem:
Aus dem Buch "C für dummies" (3. Auflage) hab ich folgendes Programm abgetippt:
Ziel dieses Programms ist es, die Unabhängigkeit der beiden Variablen v in den beiden Funktionen hier() und dort() zu demonstrieren, obwohl sie den gleichen Namen haben. Steht auch so auf der Seite beschrieben.
Abgetippt und copy-paste:
#include <stdio.h>
void hier(void);
void dort(void);
int main()
{
hier();
dort();
return 0;
}
void hier()
{
int v;
v = 6 * 5;
printf("Hier ist der Wert von v %i\n", v);
}
void dort()
{
int v;
v += 5;
printf("Dort ist der Wert von v %i\n", v);
}
Alles anzeigen
Der Compiler beschwert sich pflichtbewußt über die nicht initialisierte Variable v in der Funktion dort().
Kompiliert und gestartet:
Hier ist v = 30
Dort ist v = 35
Ähm.... Zufall???
Neue Runde:
hier(): v = 3 + 974
#include <stdio.h>
void hier(void);
void dort(void);
int main()
{
hier();
dort();
return 0;
}
void hier()
{
int v;
v = 3 + 974;
printf("Hier ist der Wert von v %i\n", v);
}
void dort()
{
int v;
v += 5;
printf("Dort ist der Wert von v %i\n", v);
}
Alles anzeigen
Ergebnis:
Hier ist v = 977
Dort ist v = 982
Also eher kein Zufall!
Aber es geht noch verrückter:
hier(): v = 3597 / 109
dort(): v wird durch q ersetzt.
#include <stdio.h>
void hier(void);
void dort(void);
int main()
{
hier();
dort();
return 0;
}
void hier()
{
int v;
v = 3597 / 109;
printf("Hier ist der Wert von v %i\n", v);
}
void dort()
{
int q;
q += 5;
printf("Dort ist der Wert von q %i\n", q);
}
Alles anzeigen
Trotz der unterschiedlichen Variablennamen bleibt q abhängig von v:
Das sollte nicht so sein. Allem Anschein nach macht der Compiler in der Funktion dort() eine Zwangsinitialisierung der Variable.
Kann man das abstellen?
Das ganze wurde mit
Qt Creator 4.12.0
Based on Qt 5.12.7 (GCC 7.5.0, 64-bit)
unter openSUSE Leap 15.3
erstellt.
Ich hab das Programm jetzt schon zig Mal auf Tippfehler geprüft, konnte aber keine finden.