freestuff.gr αρχική σελίδα
 FAQFAQ    ΑναζήτησηΑναζήτηση   Λίστα ΜελώνΛίστα Μελών   Ομάδες ΜελώνΟμάδες Μελών   <b>Εγγραφή Μέλους</b>Εγγραφή Μέλους 
 ΠροφίλΠροφίλ   Επιλογές μέλους Επιλογές   Τα bookmarks μου Τα bookmarks μου   Προσωπικά μηνύματαΠροσωπικά μηνύματα 
  διαφήμιση  

Καλώς ήρθατε στο forum μας! Για να συμμετάσχετε στις συζητήσεις θα πρέπει να είσαστε μέλος. Γίνετε μέλος τώρα!.

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


 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Moderators:  Super-Moderators, WebDev Moderators
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [10 Μηνύματα]       Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
ΑποστολέαςΜήνυμα
chief


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 10 Νοε 2008 09:56    Θέμα: malloc () και ελευθερία μνήμης.... Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 10 Νοε 2008 11:02    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 16 Νοε 2008 23:19    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 17 Νοε 2008 00:54    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 17 Νοε 2008 14:09    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 18 Αυγ 2008
Μηνύματα: 53

View users profile
ΜήνυμαΣτις: 17 Νοε 2008 20:16    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

κώδικας:


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(i=0;i<n;i++){
     ... διαβασε τα στοιχεια του μαθητη
     a1.s[i]
      }
    }
  }
}


φυσικά αυτό είναι ένα απλό παράδειγμα. Πιο σύνθετο (όταν κατανοήσεις την δυναμική απόδοση μνήμης) θα είναι οι συνδεδεμένες λίστες, τα δυαδικά ή Μ-δένδρα κτλ.
lakritidis


Μέλος από: 04 Αυγ 2005
Μηνύματα: 256+
Περιοχή: Katerini
View users profile Send email to user Visit posters website
ΜήνυμαΣτις: 21 Νοε 2008 10:52    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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

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

Πχ η δήλωση
κώδικας:
int i;


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

Αντίθετα η δήλωση
κώδικας:
int *i = malloc(sizeof(int));


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

κώδικας:
int *i = (int*)malloc(sizeof(int));


Τώρα τη μνήμη που δεσμεύσαμε, είμαστε υποχρεωμένοι να την αποδεσμεύσουμε χειροκίνητα (όταν φυσικά δε χρειαζόμαστε πλέον το περιεχόμενο της), αλλιώς έχουμε memory leak. (προσοχή στα mallocs που γίνονται μέσα σε functions)

κώδικας:
free(i);


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

Πχ

κώδικας:
int *array = (int*)malloc(100* sizeof(int)); // Δεσμεύουμε μνήμη για πίνανα integer 100 θέσεων

for (int i = 0; i < 100; i++) {
  array[i] = i;
}

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

for (int i = 100; i < 200; i++) {
  array[i] = i;
}


Με τον ίδιο τρόπο μπορούμε να κάνουμε επέκταση string και γενικά επέκταση πινάκων. Επίσης το χρησιμοποιούμε για linked structures όπως είπε και ο bxenos. Πχ μία Linked list χαρακτηρίζεται από ένα self-referencing pointer.

κώδικας:
struct list_node {
    int data;
    struct list_node *next;
}
soteres2002
S. & H. Moderator

Μέλος από: 05 Μαρ 2004
Βοηθήματα: 1
Νέα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Ιωάννινα
View users profile
ΜήνυμαΣτις: 21 Νοε 2008 17:28    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

man malloc
man realloc
man calloc
man free

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


Μέλος από: 14 Οκτ 2008
Μηνύματα: 49

View users profile Visit posters website
ΜήνυμαΣτις: 07 Δεκ 2008 20:41    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

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


Μέλος από: 25 Μαρ 2004
Βοηθήματα: 1
Scripts: 1
Μηνύματα: 256+

Περιοχή: Θεσσαλονικη-Καβαλα-βεροια(το τριγωνο της καταρας)
View users profile Visit posters website
ΜήνυμαΣτις: 07 Δεκ 2008 21:12    Θέμα: Απάντηση με παράθεση  Mark this post and the followings unread

Διαβασε το μυνημα του lakritidis

lakritidis ανέφερε:
O pointer αυτός είναι κατά κανόνα τύπου void. Στη C++, θα πρέπει να κάνουμε cast αυτόν το pointer ώστε το αριστερο και το δεξί μέλος να είναι του ίδιου τύπου.

Ο pointer που επιστρεφεται ειναι void και τον κανεις cast σε char* ωστε να ειναι αυτο που θελεις.

_________________
Αν δεν υπήρχανε οι κνίτες κι'η ηρωίνη...
Εμφάνιση Μηνυμάτων:   
Εισαγωγή νέου Θέματος   Απάντηση στο Θέμα Σελίδα 1 από 1 [10 Μηνύματα] Mark the topic unread :: Προηγούμενο θέμα :: Επόμενο θέμα
 Forum index » Δημιουργία Web Sites, Γραφικών & Προγραμματισμός » Γλώσσες Προγραμματισμού » C, C++
Τώρα είναι 05 Δεκ 2016 16:29 | All times are UTC + 2


Email This Page to Someone! add to Favorites

     Powered by p h p B B © 2001,2005 p h p B B Group
Για άμεση επικοινωνία με τον διαχειριστή του freestuff.gr στο email: freestuff.gr(παπάκι)gmail.com


Copyright © 1999-2013 Freestuff.gr All Rights Reserved  
Version Aegean, designed by N. Tsaganos