Η σελίδα μας αναβαθμίστηκε, γι' αυτό τον λόγο τα μέλη μας θα πρέπει να ζητήσουν νέο κωδικό πρόσβασης από την υπηρεσία "Αποστολή κωδικού πρόσβασης".
Εάν το email με τον νέο κωδικό δεν έρθει στο inbox κοιτάξτε και στο spam folder. Ο server είναι φρέσκος και δεν έχει το reputation που του αξίζει.

malloc () και ελευθερία μνήμης....

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: Super-Moderators, WebDev Moderators

Απάντηση
chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από chief » 10 Νοέμ 2008 09:56

Έριξα μια ματιά για την εντολή malloc() αλλά δεν πολύ κατάλαβα που διευκολύνει.
Υπάρχει κάποιος να με διαφωτίσει;

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

malloc () και ελευθερία μνήμης....

Δημοσίευση από bxenos » 10 Νοέμ 2008 11:02

Παράδειγμα: Δίνεται αρχείο με Ν αριθμούς.
Στην πρώτη γραμμή του αρχείου υπάρχει ο αριθμός Ν.
Στις επόμενες Ν γραμμές του αρχείου ακολουθούν οι Ν αριθμοί.
Να διαβαστεί το αρχείο σε έναν πίνακα και να ταξινομηθεί.

Πως θα σκεφτόσουνα την λύση της παραπάνω άσκησης;

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από chief » 16 Νοέμ 2008 23:19

Η ταξινόμηση μπορεί να γίνει και με μια loop. Και αρχικοποιόντας τον πίνακα.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

malloc () και ελευθερία μνήμης....

Δημοσίευση από bxenos » 17 Νοέμ 2008 00:54

Και πόσα στοιχεία θα βάλεις στον πίνακα; Δεν σου έδωσα το Ν.
Αρα το πρόγραμμα πρέπει να δουλεύει για οποιοδήποτε Ν.

Θα δεσμεύσεις πολύ μεγάλο χώρο για να είσαι σίγουρος; Τότε θα πρέπει για ένα μικρό προγραμμα να αναγκασεις τους χρήστες (πελάτες) να έχουν πολύ μνήμη.

Θα δεσμεύσεις λίγο; Δεν θα μπορούμ μα έχουν πολλά δεδομένα.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από chief » 17 Νοέμ 2008 14:09

Διάβασα λίγο παραπάνω και ίδια ότι η malloc() και η calloc(), "δεσμεύουν" μνήμη , συγκεκριμένη μνήμη. Με την εντολή sizeof μπορούμε να την χρησιμοποιήσουμε σε διάφορες αρχιτεκτονικές, αλλά εάν θέλω ο πίνακάς μου να είναι όμως δυναμικός? Πως γίνεται, ένα απλό παράδειγμα μπορείς να μου δόσεις? Απλό όσο γίνεται.

Άβαταρ μέλους
bxenos
Δημοσιεύσεις: 53
Εγγραφή: 18 Αύγ 2008 19:56

malloc () και ελευθερία μνήμης....

Δημοσίευση από bxenos » 17 Νοέμ 2008 20:16

Κώδικας: Επιλογή όλων


struct student {
  char onoma[32];
  unsigned apoysies;
  float	vathmos;
};

struct tmhma {
  size_t n_students;//αριθμος μαθητων στο τμημα
  student *s;//στοιχεια των μαθητων του τμηματος
};

int main(void){
  struct tmhma a1;
  {//ενημερωσε το τμημα 
    {//βρες τον αριθμο των μαθητων
      size_t n = ...ρώτα πόσους μαθητές έχει το τμήμα και αποθηκευσε το στο n...
      a1.n_students = n;
    }
    {//δεσμευσε μνημη για τους μαθητες
      a1.s = (struct student *)malloc( n * sizeof(struct student));
      if(a1.s == NULL){
	  perror("memory full");
	  exit(1);
      }
    }
    {//ενημερωσε πινακα με στοιχεια μαθητων
      size_t i;
      for&#40;i=0;i<n;i++&#41;&#123;
	  ... διαβασε τα στοιχεια του μαθητη 
	  a1.s&#91;i&#93;
      &#125;
    &#125;
  &#125;
&#125;
φυσικά αυτό είναι ένα απλό παράδειγμα. Πιο σύνθετο (όταν κατανοήσεις την δυναμική απόδοση μνήμης) θα είναι οι συνδεδεμένες λίστες, τα δυαδικά ή Μ-δένδρα κτλ.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από lakritidis » 21 Νοέμ 2008 10:52

Η C/C++ χωρίζει λογικά τη μνήμη σε δύο περιοχές: τη stack και τη heap.

Η πρώτη χρησιμοποιείται απο τα προγράμματα ώστε να δεσμεύει και να αποδεσμεύει αυτόματα μνήμη.

Πχ η δήλωση

Κώδικας: Επιλογή όλων

int i;
συνεπάγεται τη δέσμευση 4 Byte στη stack, τα οποία θα χρησιμοποιηθούν για να αποθηκεύσουν integer. To runtime είναι αυτό που θα αποφασίσει πότε θα αποδεσμεύσει αυτή τη μνήμη.

Αντίθετα η δήλωση

Κώδικας: Επιλογή όλων

int *i = malloc&#40;sizeof&#40;int&#41;&#41;;
θα δεσμεύσει 4 Bytes (sizeof int) στη heap ώστε να αποθηκεύσουμε ένα integer και θα επιστρέψει ένα pointer ο οποίος δείχνει σε αυτή την περιοχή μνήμης. O pointer αυτός είναι κατά κανόνα τύπου void. Στη C++, θα πρέπει να κάνουμε cast αυτόν το pointer ώστε το αριστερο και το δεξί μέλος να είναι του ίδιου τύπου.

Κώδικας: Επιλογή όλων

int *i = &#40;int*&#41;malloc&#40;sizeof&#40;int&#41;&#41;;
Τώρα τη μνήμη που δεσμεύσαμε, είμαστε υποχρεωμένοι να την αποδεσμεύσουμε χειροκίνητα (όταν φυσικά δε χρειαζόμαστε πλέον το περιεχόμενο της), αλλιώς έχουμε memory leak. (προσοχή στα mallocs που γίνονται μέσα σε functions)

Κώδικας: Επιλογή όλων

free&#40;i&#41;;
Χρησιμοποιούμε τη malloc ώστε να δεσμεύουμε δυναμικά μνήμη. Έτσι όταν ένας πίνακας 100 θέσεων γεμίσει, μπορούμε να διπλασιάσουμε το μέγεθος του με χρήση realloc. Αυτό δεν είναι δυνατό για μνήμη που έχουμε δεσμεύσει στη stack.

Πχ

Κώδικας: Επιλογή όλων

int *array = &#40;int*&#41;malloc&#40;100* sizeof&#40;int&#41;&#41;; // Δεσμεύουμε μνήμη για πίνανα integer 100 θέσεων

for &#40;int i = 0; i < 100; i++&#41; &#123;
  array&#91;i&#93; = i;
&#125;

// Διπλασιάζω το μέγεθος του πίνακα
array = &#40;int*&#41;realloc&#40;array, 200 * sizeof&#40;int&#41;&#41;;

for &#40;int i = 100; i < 200; i++&#41; &#123;
  array&#91;i&#93; = i;
&#125;
Με τον ίδιο τρόπο μπορούμε να κάνουμε επέκταση string και γενικά επέκταση πινάκων. Επίσης το χρησιμοποιούμε για linked structures όπως είπε και ο bxenos. Πχ μία Linked list χαρακτηρίζεται από ένα self-referencing pointer.

Κώδικας: Επιλογή όλων

struct list_node &#123;
    int data;
    struct list_node *next;
&#125;

Άβαταρ μέλους
soteres2002
S. & H. Moderator
Δημοσιεύσεις: 1524
Εγγραφή: 05 Μαρ 2004 22:17
Τοποθεσία: Ιωάννινα

malloc () και ελευθερία μνήμης....

Δημοσίευση από soteres2002 » 21 Νοέμ 2008 17:28

man malloc
man realloc
man calloc
man free

σε ένα unix terminal για μια ιδέα της χρήσης τους.

chief
Δημοσιεύσεις: 49
Εγγραφή: 14 Οκτ 2008 13:37
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από chief » 07 Δεκ 2008 20:41

Επανέρχομαι λίγο στο θέμα της malloc() Και θα ήθελα να κάνω μια ερώτηση έχω το παρακάτω παράδειγμα
p=(char *)malloc( 8 );
Το μόνο που με μπερδεύει σε αυτό το απλό παράδειγμα είναι το (char *).
Μια εξήγηση κάποιος;

Άβαταρ μέλους
tix-3-
Δημοσιεύσεις: 827
Εγγραφή: 25 Μαρ 2004 05:12
Τοποθεσία: Θεσσαλονικη-Καβαλα-βεροια(το τριγωνο της καταρας)
Επικοινωνία:

malloc () και ελευθερία μνήμης....

Δημοσίευση από tix-3- » 07 Δεκ 2008 21:12

Διαβασε το μυνημα του lakritidis
lakritidis έγραψε: O pointer αυτός είναι κατά κανόνα τύπου void. Στη C++, θα πρέπει να κάνουμε cast αυτόν το pointer ώστε το αριστερο και το δεξί μέλος να είναι του ίδιου τύπου.
Ο pointer που επιστρεφεται ειναι void και τον κανεις cast σε char* ωστε να ειναι αυτο που θελεις.
Αν δεν υπήρχανε οι κνίτες κι'η ηρωίνη...

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης