2016-09-16 4 views
0

Ich habe eine Struktur mit einem Array von Zeigern auf Ganzzahlen. Der Wert des ersten Zeigers ändert sich zwischen den Aufrufen von printf. Dies geschieht nicht, wenn ich die Struktur nicht über eine Funktion erzeuge. Der Code ist unten. Kann mir jemand sagen, was passiert? Vielen Dank.Strukturvariable ändert Wert mit printf

struct a { 

    int *nums[10]; 

}; 

struct a *makeS(); 


int main(int argc, char *argv[]){ 

     struct a *_b = (struct a*) malloc(sizeof(struct a)); 

     struct a *_c = makeS(); 

     int i = 1; 

     _b->nums[0] = &i; 

     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 
     printf("Num is %d\n", *_b->nums[0]); // prints 1 … etc. 


     printf("Num is %d\n", *_c->nums[0]); // prints 1 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 
     printf("Num is %d\n", *_c->nums[0]); // prints 0 … etc. 


    } 

    struct a* makeS(){ 

     struct a *_s = (struct a*) malloc(sizeof(struct a)); 

     int i = 1; 

     _s->nums[0] = &i; 

     return _s; 

} 
+2

Sie ordnen '& i' zu '_s-> nums [0]' zu, aber 'i' stoppt den Moment, in dem' makeS() 'beendet wird. –

+0

Wenn der Speicher für keine Variablen länger gehalten wird, dann wirken sich die Details der Programmstruktur (wie zum Beispiel das Erstellen von Daten mit einer Funktion oder nicht) genau darauf aus, welcher Speicher überschrieben wird. Beide Situationen sind undefiniert, was das Verhalten sein wird, aber manchmal ist dieses undefinierte Verhalten auch das gewünschte Verhalten - aber das ist nur Glück. – xaxxon

Antwort

6

Ihr Problem ist in der Funktion:

struct a* makeS(){ 

     struct a *_s = (struct a*) malloc(sizeof(struct a)); 

     int i = 1; 

     _s->nums[0] = &i; 

     return _s; 

} 

int i geht aus Rahmen, da es eine lokale Variable ist, dh Sie können eine baumelnde Zeiger verwenden.

Der Speicher, der von i verwendet wird, kann frei von etwas anderem verwendet werden und wird höchstwahrscheinlich durch den Puffer oder Arbeitsspeicher, der in den nachfolgenden printf-Aufrufen verwendet wird, erneut verwendet.

+0

Danke - sehr hilfreich :) –