Frage zu C

mr.man

Cadet 4th Year
Registriert
Okt. 2010
Beiträge
73
Hi,

also folgendes problem:
ich habe eine struct myStruct { int bla}, ein array struct *myStruct list[10] und eine Funktion
int myFunc(int i, int j){
...
struct myStruct temp = {i};
list[j] = &temp;
printf("%d/n", &temp);
...
return 0;
}
der printf() aufruf gibt jetzt bei jedem funktionsaufruf die selbe adressebauf der konsole aus, das heißt, dass alle pointer in list auf das selbe element temp zeigen (und zwar das ,das als letztes hinzugefügt wurde)
ich habe keine ahnung wie ich dieses problem lösen kann, bei java konnte ich ja sowas machen:
list[j] = new myObject(i);
aber wad mache ich in C?

Sorry für den nicht formatierten Code, bin nur aufm handy on

Danke im voraus schonmal
mfg
mrman
 
Willst du die Funktion Dynamisch haben oder soll pro Befehl ein Kommando ausgeführt werden?
 
Du legst temp auf dem Stack an. Das heißt, so bald das scope von temp verlassen wird (in diese Fall, wenn die Funktion myFunc() verlassen wird), wird diese struct-Instanz wieder vernichtet, und deine in list gespeicherte Adresse ist nicht mehr gültig. Wenn du temp so anlegen willst, daß es auch nach verlassen von myFunc bestehen bleibt, mußt du mit dynamischer Speicherallozierung arbeiten (Stichwörter malloc und free).

Daß temp bei wiederholten Aufrufen von myFunc() immer wieder auf die selbe Stackadresse fällt, ist Zufall.
 
also z.b. sowas in der art:
struct myStruct *temp = malloc(sizeof(struct myStruct));
?
der Hintergrund ist übrigens die Implementierung einer hash table, in der ich halt mittels einer set(key, value) Funktion ein array füllen will, was halt wegen dieses fehlers noch nicht klappt
 
Zuletzt bearbeitet:
Also wie jetzt? Dein list ist global definiert und da soll was genau rein? So wie das da oben steht, kannst du genau so gut Zufallswerte reinschreiben, die Adresse von irgend einem temporären struct hat nicht viel mehr Sinn.
Außerdem sind da anscheinend ein paar Tippfehler drin. Bei der Definition von list ist ein * vor mystruct und list[j] kannst du wohl schlecht ein Integer zuweisen.
 
Entweder erstellst du das Struct außerhalb der Funktion, damit es im Stack bleibt oder du packst es manuell in den Heap.
Code:
...
int main() {
  struct myStruct s1 = {42};
  addToArray(0, &s1);
  // lebt jetzt weiter
}
oder (wird mit typedef übersichtlicher)
Code:
typedef struct myStruct myStructType;
// in myFunc (cast wegen void-pointer)
myStructType *s = (myStructType*) malloc(sizeof(myStructType));
s->bla = 42;
// ein free irgendwann wäre auch keine schlechte Idee
free(s);

PS: In Java geht das einfacher, weil new für dich das malloc im Hitnergrund macht und der GC das ganze auch wieder aufräumt (das free).
 
Zuletzt bearbeitet:
mit
Code:
myStructType *s = (myStructType*) malloc(sizeof(myStructType));
klappt es jetzt endlich, danke! :)
 
Zurück
Oben