Προς το περιεχόμενο

Segmentation fault, Static variables


kfoynt

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα και πάλι

 

Έχω ένα αρχείο Pb.h στο οποίο έχω ορίσει μία μεταβλητή:

 

static Pb* pb_static_instance; (Pb ειναι μία structure)

 

Έχω και ένα άλλο αρχείο interface.c το οποιο κάνει include το Pb.h και χειρίζεται την μεταβλητή pb_static_instance. Όλα καλά μέχρι εδώ κανένα πρόβλημα...

 

Υπάρχει όμως και ένα άλλο αρχέιο το mtxFreeIPM.c το οποίο επίσης κάνει include to Pb.h, και στο οποίο προσπαθώ να διαβάσω τις αλλαγές που έγιναν στην pb_static_instance μέσω του interface.c.

 

Όταν πάω να διαβάσω την static μεταβλητή απο το mtxFreeIPM.c τότε μου πετάει segmentation fault

 

καμία ιδεα?? προσπαθώ αρκετή ώρα αλλα δεν βγαινει τίποτα!

 

---------- Προσθήκη στις 22:06 ---------- Προηγούμενο μήνυμα στις 21:58 ----------

 

PS: έκανα print μέσω του debugger στην μεταβλητή pb_static_instance όταν ήμουν στο mtxFreeIPM.c και μου δείχνει ότι έχει γινει initialized ως NULL!!

 

Γιατί όμως? αφου πιο πριν μέσα στο interface.c μπορώ και την κάνω initialize ως:

 

pb_static_instance = VECT(Pb, 1);

 

και μετά μπορώ να την χειρίζομαι κανονικα, τα print statements που δοκίμασα μου δειχνουν τις σωστές τιμές...

Δημοσ.

Μία static μεταβλητή στη C περιορίζεται όσον αφορά την χρήση της στο αρχείο που έιναι δηλωμένη. Συνήθως δεν ορίζουμε μια μεταβλητή ως static σε ένα header file, όχι επειδή δεν επιτρέπεται άλλα επειδή δεν χρησιμέυει σε τίποτα. Γιατί δηλώνοντας μια μεταβλητή ως static σε ένα header file, τότε σε κάθε αρχείο (.c) κώδικα που το κάνει include, δημιουργείται και μία νέα μοναδική κόπια της static μεταβλητής για χρήση και μόνο εσωτερικά στο εκάστοτε αρχείο. Οπότε στην δική σου περίπτωση στο δέυτερο αρχείο η μεταβλητή pb_static_instance δεν έχει αρχικοποιηθεί ποτέ!

Δημοσ.
Μία static μεταβλητή στη C περιορίζεται όσον αφορά την χρήση της στο αρχείο που έιναι δηλωμένη. Συνήθως δεν ορίζουμε μια μεταβλητή ως static σε ένα header file, όχι επειδή δεν επιτρέπεται άλλα επειδή δεν χρησιμέυει σε τίποτα. Γιατί δηλώνοντας μια μεταβλητή ως static σε ένα header file, τότε σε κάθε αρχείο (.c) κώδικα που το κάνει include, δημιουργείται και μία νέα μοναδική κόπια της static μεταβλητής για χρήση και μόνο εσωτερικά στο εκάστοτε αρχείο. Οπότε στην δική σου περίπτωση στο δέυτερο αρχείο η μεταβλητή pb_static_instanc δεν έχει αρχικοποιηθεί ποτέ!

 

 

οκ... χαίρομαι για αυτό που διαβάζω... :-D και το συνειδητοποίησα και απο το debug...

Αλλά γίνεται τελικά να έχω μία μεταβλητη στο πρόγραμμα που θα χρησιμοποιείται απο διάφορα αρχεία??

 

Δοκίμασα και global μεταβλητές δηλωμένες εκτός main αλλα πάλι το ίδιο πρόβλημα.. εκτός αν κάτι δεν έκανα καλα...

Δημοσ.
Καλησπέρα και πάλι

 

... προσπαθώ να διαβάσω τις αλλαγές που έγιναν στην pb_static_instance μέσω του interface.c

 

Αυτό δεν είναι σαφές.

Ούτε είναι σαφές πώς θέλεις να χρησιμοποιήσεις την μεταβλητή : ως global ή ως static global ;

 

Θυμάμαι ότι δηλώνοντας static μια global μεταβλητή η εμβέλειά της περιορίζεται στο αρχείο που την δηλώνεις.

Εδώ είναι το σφάλμα.

 

Eκείνο που καταλαβαίνω είναι ότι την δηλώνεις στο include (και δεν είναι μέλος κλάσης).

Mετά την αρχικοποιείς και την ορίζεις στο cpp.

Kατόπιν επιχειρείς να την χρησιμοποιήσεις και σε άλλο cpp και τότε παρουσιάζεται σφάλμα.

Eφόσον την θέλεις global, aν την δηλώσεις extern θα γίνει global και θα αρθεί το πρόβλημα.

 

 

O φίλος από πάνω με πρόλαβε.

 

Λοιπόν, θέλεις να την έχεις global. Δήλωσέ την extern όπως ήδη έγραψα - αυτό είναι που θέλεις !

Δημοσ.
Αυτό δεν είναι σαφές.

Ούτε είναι σαφές πώς θέλεις να χρησιμοποιήσεις την μεταβλητή : ως global ή ως static global ;

 

Θυμάμαι ότι δηλώνοντας static μια global μεταβλητή η εμβέλειά της περιορίζεται στο αρχείο που την δηλώνεις.

Μάλλον εδώ είναι το σφάλμα.

 

Eκείνο που καταλαβαίνω είναι ότι την δηλώνεις στο include (και δεν είναι μέλος κλάσης).

Mετά την αρχικοποιείς και την ορίζεις στο cpp.

Kατόπιν επιχειρείς να την χρησιμοποιήσεις και σε άλλο cpp και τότε παρουσιάζεται σφάλμα.

Eφόσον την θέλεις global, aν την δηλώσεις extern θα γίνει global και θα αρθεί το πρόβλημα.

 

 

O φίλος από πάνω με πρόλαβε.

 

Λοιπόν, θέλεις να την έχεις global. Δήλωσέ την extern όπως ήδη έγραψα !!

 

 

ok... το δοκιμάζω τώρα... ελπίζω να δουλέψει!!! ευχαριστώ!!!

Δημοσ.

Τότε πρέπει να χρησημοποιήσεις extern μεταβλητές, π.χ:

 

my_header.h (δεν έιναι απαραίτητο, αλλά βοηθάει στην συντήρηση του κώδικά)

>
....
extern Pb* pb_static_instance;
....

 

my_source1.c

>
#include "my_header.h" (ούτε αυτό έιναι απαραίτητο για τις extern μεταβλητές)
....
extern Pb* pb_static_instance; /* εδώ λέμε ότι η μεταβλητή pb_static_instance
                                 έιναι "κάπου" (που?) δηλωμένη */

...
printf("address of pb_static_instance is %p\n", pb_static_instance);
....

 

my_source2.c

>
#include "my_header.h" (ούτε και αυτό έιναι απαραίτητο για τις extern μεταβλητές)
....
Pb* pb_static_instance; /* εδώ δηλώνουμε τη μεταβλητή και πάντα σε global
                                      θέση στο αρχείο, όχι σε καμία function */
...
pb_static_instance = VECT(Pb, 1); /* initialization */
....

 

Υ.Γ Συμπληρωματική απάντηση σε αυτή του V.I.Smirnov, που με πρόλαβε τώρα εκείνος

Δημοσ.

Δεν το πιστεύω... δούλεψε! έχω χαζέψει απο την χαρά μου! :-D τόσο εύκολο... :-D :-D :-D

 

 

Ευχαριστώ και τους 2!

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...