problem mit globalen variablen
-
ich habe vor ein paar wochen angefangen c zu programmieren und bin im moment dabei, ein paar triviale programme zu schreiben.
ich habe jetzt folgende frage:
ist es möglich einer globalen variablen (einem array) dynamisch speicher zuzuweisen?
also ganz einfach mitstruct StructName **lists_ = malloc(MULTIPL * sizeof(struct StructName *)); main() { }
mein compiler gibt mir da immer ein fehlermeldung, ähnlich wie "initializer not konstant" oder so.
mach ich einen fehler oder geht das allgemein nicht?mfg
Sebastian Hofer
-
Ja, es ist. Aber du kannst außerhalb von Funktion nicht auf andere Funktionen zugreifen. D.h. dein malloc kannst du nur in einer Funktion benutzen. Du kannst in main das machen.
struct StructName **lists_; int main() { lists_ = (struct StructName**) malloc(sizeof(struct StructName*)*MULTIPL); .... .... free(lists_); return 0; }
2. Deine Deklaration von main ist nicht Standard (nicht ANSI), die Funktion muss
int main(); /* oder */ int main(int argc, char* argv[]); /* oder */ int main(int argc, char** argv);
so aussehen. Und main liefert 0, wenn das Programm keine Fehler hatte, eine Zahl ungleich 0, sonst.
-
und lists_ ist dann trotzdem in allen funktionen verwendbar?! super, danke für die hilfe!!
wegen meiner fehlerhaften main: das war nur zur illustration wie ich die variable im prinzip deklariert habe.
Sebastian
-
sebhofer schrieb:
und lists_ ist dann trotzdem in allen funktionen verwendbar?! super, danke für die hilfe!!
ja, deshalb ist lists_ eine globale Variable, oder?
-
Die main ist nicht wirklich fehlerhaft, es ist nur eine veraltete Schreibweise. In C89 war so ziemlich alles implizit int, wenn es nicht anders deklariert wurde, von daher ist
main(argc, argv) char *argv[]; /* <-- noch eine veraltete Schreibweise */{ }
das selbe wie
int main(int argc, char *argv[]) { }
In C99 ist das allerdings nicht mehr zulässig, und es ist eigentlich generell ganz sinnvoll, den Typen dran zu schreiben - verbessert die Lesbarkeit des Codes.
-
sebhofer schrieb:
struct StructName **lists_ = malloc(MULTIPL * sizeof(struct StructName *)); main() { }
mein compiler gibt mir da immer ein fehlermeldung, ähnlich wie "initializer not konstant" oder so.
eher "invalid conversion...."
malloc gibt einen void* zurück, der typecast fehlt dir.
so geht's:struct StructName **lists_ = (StructName**)malloc(MULTIPL * sizeof(struct StructName *)); main() { }
-
Hallo,
net schrieb:
malloc gibt einen void* zurück, der typecast fehlt dir.
und genau deswegen muss die stdlib.h eingebunden werden, denn dann kann auf den Cast komplett verzichtet werden. Ansonsten liefert malloc nämlich int zurück (da der Prototyp nicht bekannt ist) und somit wäre auch ein Cast notwendig.
-
erstmal danke an alle für die mithilfe.
mittlerweile bin ich aber wieder etwas verwirrt.@ net:
supertux' lösung kam mir recht einleuchtend vor. du sagst aber wieder, dass es nur an dem fehlenden cast liegt.
wem soll ich jetzt glauben!? (kann's im mom nicht ausprobieren)
ich glaube dass supertux' lösung eher funktioniert.thx
Sebastian
-
CarstenJ schrieb:
net schrieb:
malloc gibt einen void* zurück, der typecast fehlt dir.
und genau deswegen muss die stdlib.h eingebunden werden, denn dann kann auf den Cast komplett verzichtet werden. Ansonsten liefert malloc nämlich int zurück (da der Prototyp nicht bekannt ist) und somit wäre auch ein Cast notwendig.
macht bei mir keinen unterschied. ob ich stdlib.h reinnehme oder nicht, den typecast brauche ich immer sonst mault der compiler (mingw)
sebhofer schrieb:
supertux' lösung kam mir recht einleuchtend vor. du sagst aber wieder, dass es nur an dem fehlenden cast liegt.
wem soll ich jetzt glauben!? (kann's im mom nicht ausprobieren)
ich glaube dass supertux' lösung eher funktioniert.also mingw frisst beide....
-
Hallo,
sicher, dass das kein C++ Projekt ist?
-
-
sebhofer schrieb:
@net:
ok, thx@CarstenJ:
*gg* ja, aber das ist auch das einzige, bei dem ich mir sicher bin.Jo, bei dir bin ich mir auch sicher, aber ich meinte net.
Denn bei C++ ist ein Casten bei malloc sehr wohl notwendig.
-
da hab ich dann wohl was falsch verstanden *lol*
sorry
-
CarstenJ schrieb:
sicher, dass das kein C++ Projekt ist?
jo, das wars.
das file hiess zwar .c aber er hat's doch als c++ compiliert.
jetzt kommt auch das "initializer element is not constant"sch.... mingw dev studio!