Διάλεξη 9: Δυναμική Δέσμευση Μνήμης

Σχετικά έγγραφα
ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης (Κεφάλαιο , KNK-2ED)

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C Δυναμική διαχείριση μνήμης

Ανάπτυξη και Σχεδίαση Λογισμικού

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διάλεξη 10: Δομές Δεδομένων Ι (Στοίβες & Ουρές)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Η γλώσσα C. Δείκτες και Διαχείριση Μνήμης (memory management)

Προγραμματισμός Ι (ΗΥ120)

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

Διαδικασιακός Προγραμματισμός

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Διάλεξη 5: Δείκτες και Συναρτήσεις

Προγραμματισμός Ι (ΗΥ120)

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Διάλεξη 6: Δείκτες και Πίνακες

Δομημένος Προγραμματισμός (ΤΛ1006)

Διάλεξη 20: Χαμηλού Επιπέδου Προγραμματισμός II

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

HY150a Φροντιστήριο 3 24/11/2017

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Υπολογιστών με C++

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΗΥ-150. Προγραµµατισµός. υναµική ιαχείριση Μνήµης (1/2)

Εισαγωγή στον Προγραμματισμό

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Προγραμματισμό

Δομημένος Προγραμματισμός (ΤΛ1006)

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 11η: Δείκτες, μέρος 1

ΠΛΗ111. Ανοιξη Μάθηµα 1 ο Ανασκόπηση της Γλώσσας Προγραµµατισµού C. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

ιαφάνειες παρουσίασης #5 (β)

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

Διαδικαστικός Προγραμματισμός

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

ΗΥ-150. Προγραμματισμός

Προγραμματισμός Δομές Δεδομένων

Μεθόδων Επίλυσης Προβλημάτων

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμό για ΗΜΥ

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου

Στοίβες με Δυναμική Δέσμευση Μνήμης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Μεθόδων Επίλυσης Προβλημάτων

Μεθόδων Επίλυσης Προβλημάτων

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

Εισαγωγή στον δομημένο προγραμματισμό

Περιεχόμενα. Πρόλογος... 21

Προγραµµατισµός Ι 1

Μεθόδων Επίλυσης Προβλημάτων

Περιεχόμενα. Πρόλογος... 17

ΕΡΓΑΣΤΗΡΙΟ 8: Πολυδιάστατοι Πίνακες και Δυναμική Δέσμευση Μνήμης

Διδάσκων: Παναγιώτης Ανδρέου

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Δομές Δεδομένων. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Δομημένος Προγραμματισμός (ΤΛ1006)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Προγραμματισμός Ι (ΗΥ120)

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

Διαδικαστικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Ορισμός μεταβλητών δεικτών και αρχικοποίηση

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Γλώσσα Προγραμματισμού C

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Ανάπτυξη και Σχεδίαση Λογισμικού

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

Προγραμματισμός Ι (ΗΥ120)

Lab 1: C/C++ Pointers and time.h. Panayiotis Charalambous 1

Διαδικασιακός Προγραμματισμός

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

Transcript:

Τμήμα Πληροφορικής Πανεπιστήμιο Κύπρου ΕΠΛ132 Αρχές Προγραμματισμού II Διάλεξη 9: Δυναμική Δέσμευση Μνήμης (Κεφάλαιο 17.1-17.4, KNK-2ED) Δημήτρης Ζεϊναλιπούρ http://www.cs.ucy.ac.cy/courses/epl132 9-1

Περιεχόμενο Διάλεξης 9 Δυναμική Δέσμευση Μνήμης Συναρτήσεις Δέσμευσης Μνήμης Δείκτες NULL Δυναμικά Δεσμευμένες Συμβολοσειρές Συμβολοσειρές με Δυναμική Χορήγηση Μνήμης Πίνακες Δυναμικά Δεσμευμένων Συμβολοσειρών Αποδέσμευση Μνήμης H συνάρτηση free To πρόβλημα του αιρούμενου δείκτη (dangling pointer) Δυναμικά Δεσμευμένοι Πίνακες Συναρτήσεις malloc, calloc και realloc 9-2

Δυναμική Δέσμευση Μνήμης (Dynamic Storage Allocation) Δυναμική Δέσμευση Μνήμης: H διαδικασία κατά την οποία εκχωρείται επιπλέον χώρος σε μια διεργασία (πρόγραμμα) από τον Πυρήνα Εφαρμογές: Δέσμευση Μνήμης όταν απαιτείται και αποδέσμευση όταν δεν απαιτείται. Δημιουργία Πίνακα Μη-προκαθορισμένων διαστάσεων Δημιουργία Συμβολοσειράς αυθαίρετου μεγέθους. Δημιουργία σύνθετων δομών δεδομένων στη μνήμη (όπως λίστες, δέντρα, στοίβες, ουρές, κτλ.). 9-3

Δυναμική Δέσμευση Μνήμης (Dynamic Storage Allocation) Η μνήμη που εκχωρείται σε ένα πρόγραμμα (μέσω π.χ., malloc) είναι προσπελάσιμη μέσω της σωρού (heap) της. Η γενική φιλοσοφία είναι ότι οι μεταβλητές τύπου δείκτη από τη στοίβα του προγράμματος δείχνουν στο δεσμευμένο χώρο που εκχωρείται στο πρόγραμμα Π.χ., char *name; Τα αντικείμενα μέσα στη σωρό είναι προσπελάσιμα από οποιοδήποτε συνάρτηση (σε οποιοδήποτε επίπεδο Κάνοντας χρήση της διεύθυνσης του αντικείμενου, π.χ., 0x80483AB η οποία αποθηκεύεται μέσα στο char *name; ΔΙΕΡΓΑΣΙΑ high address argv, argc and envir. variables STACK char *name; HEAP 0x80483ABΑ BSS+DATA TEXT low address 9-4

Συναρτήσεις Δέσμευσης Μνήμης (Memory Allocation Functions) Η βιβλιοθήκη <stdlib.h> ορίζει τρεις συναρτήσεις (κλήσεις συστήματος) για να εκχωρηθεί μνήμη από τον πυρήνα του Λειτουργικού Συστήματος : malloc: Δεσμεύει ένα block μνήμης (μετριέται σε bytes) αλλά ΔΕΝ τον αρχικοποιεί. calloc: Δεσμεύει ένα block μνήμης και το αρχικοποιεί (με τον χαρακτήρα '\0'). realloc: Αλλάζει το μέγεθος ενός προηγούμενου δεσμευμένου μπλοκ μνήμης. Αυτές οι συναρτήσεις επιστρέφουν μια τιμή τύπου void * (ένα "γενικό" δείκτη δηλαδή, εφόσον κατά τη δέσμευση δεν είναι γνωστό τι τελικό τύπο θα έχει η εν λόγω μνήμη). 9-5

New Heap Συναρτήσεις Δέσμευσης Μνήμης δ) (Memory Allocation Functions) Αναπαράσταση της Διαδικασίας Δέσμευσης Μνήμης από ένα Πρόγραμμα STACK α) char *name; name = (char *) malloc(5); ε) name[0]='a'; a HEAP DATA β) malloc(5) γ) Διεύθυνση Μνήμης που Εκχωρήθηκε π.χ., 0x80483ABΑ ή NULL σε περίπτωση αδυναμίας εκχώρησης Πυρήνας Λειτουργικού Συστήματος (Kernel) TEXT Το Πρόγραμμα μας 9-6

Συναρτήσεις Δέσμευσης Μνήμης (malloc) Πρότυπο Συνάρτησης: void *malloc(size_t size); Δεσμεύει ένα block μνήμης (μεγέθους size bytes) αλλά ΔΕΝ τον αρχικοποιεί. Η συνάρτηση επιστρέφει ένα δείκτη στον χώρο που δεσμεύτηκε. Βιβλιοθήκη: <stdlib.h> size_t είναι τύπου unsigned integer το οποίο ορίζεται στη βιβλιοθήκη. 9-7

Συναρτήσεις Δέσμευσης Μνήμης Παράδειγμα κλήσης malloc το οποίο δεσμεύει χώρο στη σωρό προγράμματος για μια συμβολοσειρά n χαρακτήρων (+1 για το επιπλέον '\0' χαρακτήρα): p = malloc(n + 1); (malloc) Εφόσον ο δείκτης p αναφέρεται ουσιαστικά σε char *, είναι καλή πρακτική (εάν και όχι απαραίτητη) να γίνεται το ανάλογο casting: p = (char *) malloc(n + 1); Άλλο Παράδειγμα δέσμευσης 10 PERSON p = (PERSON *) malloc (sizeof(person)*10); 9-8

NULL Δείκτες (Null Pointers) Εάν ο πυρήνας δεν μπορεί να παραχωρήσει τον αιτούμενο χώρο, επιστρέφεται στη κλήση δέσμευσης μνήμης ένας Κενός Δείκτης (Null Pointer). p = malloc(10000); if (p == NULL) { /* allocation failed; take action */ } ή if ((p = malloc(10000)) == NULL) { } Κενός Δείκτης: Μια ειδική τιμή (δηλ., 0) η οποία μπορεί να διαχωριστεί από τις υπόλοιπες τιμές που δύναται να έχει ένας ορθός δείκτης (σε διεύθυνση μνήμης). printf("%ld", (unsigned long int) NULL); Τυπώνει "0" άρα if (p == NULL) if (!p) if (p!= NULL) if (p) 9-9

NULL Δείκτες (Null Pointers) Εάν και το NULL μοιάζει με την τιμή 0, αυτό είναι διαφορετικό από τις επί μέρους αναπαραστάσεις του 0 που γνωρίζουμε: 0 (τύπου ακεραίου, π.χ., int) '\0' (τύπου χαρακτήρα, δηλ., char) Σε πολλούς αρέσει : #define NUL '\0' "0" (τύπου συμβολοσειράς, δηλ char[]) NULL (τύπου δείκτη, δηλ., void *, char *, int *,, κτλ.) int *p = (void *) 0; /* Άσχημο Στυλ */ int *p = NULL /* Καλό Στυλ */ 9-10

Δεδομένα στη Σωρό (Data in Program Heap) Ένα αντικείμενο στη σωρό του προγράμματος είναι προσπελάσιμο μέσω της διεύθυνσης του Συνεπώς, εάν δημιουργηθεί μια δομή δεδομένων στη σωρό τότε οποιαδήποτε συνάρτηση μπορεί να επεξεργάζεται τα στοιχεία τα οποία περνάνε της δια-αναφοράς. Main: char *name = malloc(5); foo(name); Foo: name[0]='a'; HEAP DATA TEXT Το Πρόγραμμα μας a 0x80483ABΑ S T A C K 9-11

Συναρτήσεις & Δυναμική Δέσμευση Μνήμης (H Συνάρτηση strcat) Ας θυμηθούμε ξανά τη συνάρτηση strcat(s1, s2),από τη διάλεξη 7, η οποία αντιγράφει το s2 στο τέλος του s1. Πρίν 0 1 2 3 4 5 s1 H E L L O \0 6 7 8 9???? s1 Μετά 0 1 2 3 4 5 H E L L O C 6 7 8 9 A T \0? s2 0 1 2 3 4 5 C A T \0?? 6 7 8 9???? Θυμάστε ότι η υλοποίηση που είχαμε δώσει μπορούσε να προκαλέσει υπερχείλιση του s1 Άσκηση: Δώστε μια συνάρτηση με το η οποία επιτελεί την ίδια εργασία αλλά δεν προκαλεί υπερχείλιση του s1 με τη χρήση της malloc() char *mystrcat(const char *s1, const char *s2) επιστροφή s2 0 1 2 3 4 5 C A T \0?? 6 7 8 9???? 9-12

H Συνάρτηση mystrcat ΧΩΡΙΣ Υπερχείλιση του s1 char *mystrcat(const char *s1, const char *s2) { if ((s1==null)&&(s2==null)) return NULL; char *result = NULL; } result = malloc(strlen(s1) + strlen(s2) + 1); if (result == NULL) { printf("error: malloc failed in concat\n"); return NULL; } strcpy(result, s1); strcat(result, s2); return result; 9-14

Δεδομένα στη Σωρό (Struct Malloc) #include <stdio.h> #include <stdlib.h> typedef struct { int type; char flag; } TEST, *TESTPTR; int main() { } TEST test; TESTPTR tptr = NULL; tptr = (TESTPTR) malloc(sizeof(test)); tptr->type = 1; tptr->flag = 'a'; printf("%d, %c\n", tptr->type, tptr->flag); test.type = 2; test.flag = 'b'; printf("%d, %c\n", test.type, test.flag); return 0; Δεν συνίσταται να βαφτίζετε δείκτες σε κάτι άλλο εφόσον οι αναφορές δεν θα έχουν πλέον το *, πραγμα το οποίο ενδέχεται να περιπλέκει την ανάγνωση του κώδικα. 9-15

Αποδέσμευση Μνήμης (Deallocating Storage) Τα δεδομένα της σωρού έχουν στατική αποθηκευτική διάρκεια. Συνεπώς, με την ολοκλήρωση μιας συνάρτησης αυτά ΔΕΝ διαγράφονται αυτόματα. Η αποδέσμευση πρέπει να γίνεται από τον προγραμματιστή με την εντολή free() Πρότυπο Συνάρτησης free: void free(void *ptr); Κλήση στον Πυρήνα για αποδέσμευση χώρου που δεικνύεται από το ptr. Main: char *name = malloc(5); foo(name); Foo: free(a) 0x80483ABΑ HEAP DATA TEXT Το Πρόγραμμα μας S T A C K 9-16

Αποδέσμευση Μνήμης (Deallocating Storage) Πριν προχωρήσουμε να αναφέρουμε ότι κατά τον τερματισμό μιας διεργασίας, ΟΛΗ η μνήμη του προγράμματος επιστρέφεται στον πυρήνα του Λ.Σ. TEXT, DATA, STACK, HEAP, κτλ. Ωραία, τότε γιατί εκτελούμε τη free(); Τα προγράμματα (π.χ., υπηρεσίες συστήματος) σχεδιάζονται για να λειτουργούν χωρίς επανεκκίνηση. Συνεπώς, εάν δεν γίνεται free(), τότε σύντομα θα αναλωθεί όλη η μνήμη και οι κλήσεις malloc θα παίρνουν NULL ΔΙΕΡΓΑΣΙΑ high address argv, argc and envir. variables STACK char *name; HEAP 0x80483AB BSS+DATA TEXT low address 9-17

Διαρροή Μνήμης (Memory Leak) Διαρροή Μνήμης (Memory Leak): Κατάσταση κατά την οποία μια διεργασία δεσμεύει μνήμη από το Λ.Σ. αλλά ΔΕΝ μπορεί να το επιστρέψει στο Λ.Σ. Συμβαίνει όταν χάσουμε την αναφορά σε αντικείμενα δεσμευμένα στη Σωρό. Παράδειγμα Memory Leak p = malloc( ); q = malloc( ); // free(p); p = q; Σκουπίδια!!! (garbage) ΠΡΙΝ το Memory Leak META το Memory Leak X ΔΙΕΡΓΑΣΙΑ high address argv, argc and envir. variables STACK char *name; HEAP BSS+DATA TEXT 9-18 low address

Προβλήματα με τη Free() Εάν προκύψουν προβλήματα στη free (crash), τότε αυτό οφείλεται μάλλον σε ένα από τους ακολούθους λόγους Η περιοχή έχει αποδεσμεύει ήδη (από προηγούμενη κλήση) Ο δείκτης που επιχειρείται να αποδεσμεύσετε δεν είναι δείκτης που επιστράφηκε από malloc/calloc/realloc. Αποφεύγετε τη κλήση fp = malloc( ) αμέσως μετά από free(fp) Σε κάποια συστήματα έχουν παρατηρηθεί διάφορα προβλήματα με αυτή τη λογική. 9-19

Αιρούμενος Δείκτης (Dangling Pointer) Αιρούμενος Δείκτης (Dangling Pointer): Δείκτης ο οποίος δείχνει σε αντικείμενο το οποία δεν υπάρχει στην μνήμη. Π.χ., έχει αποδεσμευθεί από άλλη free το εν λόγω αντικείμενο. Παράδειγμα Αιρούμενου Δείκτη char *p = NULL; char *q = malloc( ); p = q; q free(p); // To q είναι dangling pointer strcpy(q, "abc") // crash p 9-20

Δυναμικά Δεσμευμένοι Πίνακες (Dynamically Allocated Arrays) Οι δυναμικά δεσμευμένοι πίνακες έχουν τα ίδια πλεονεκτήματα με τα δυναμικά strings. Η συνυφασμένη έννοια των πινάκων / δεικτών μας επιτρέπει να επεξεργαζόμαστε τους δυναμικούς πίνακες με την ίδια ευκολία που το πράττουμε με τους σταθερούς πίνακες. Παραδείγματα που θα μελετήσουμε: Δημιουργία δυναμικού 1-d διανύσματος Δημιουργία δυναμικού m-d πίνακα 9-21

Δυναμικά Δεσμευμένοι Πίνακες (Μονοδιάστατος Πίνακας) Παράδειγμα #include <stdio.h> #include <stdlib.h> int main() { } int *a = NULL, n; printf("enter Array Size:"); scanf("%d", &n); /* Δημιουργία Δυναμικού Πίνακα στη Σωρό*/ a = (int *) malloc(n * sizeof(int)); /* Αρχικοποίηση και Εκτύπωση Πίνακα */ for (int i = 0; i < n; i++) a[i] = i; for (int i = 0; i < n; i++) printf("%3d,", a[i]); /* Απελευθέρωση Δυναμικού Πίνακα στη Σωρό */ free(a); return 0; Δημιουργία δυναμικού 1-d διανύσματος 9-22

Δυναμικά Δεσμευμένοι Πίνακες (Συνεχόμενος Πολυδιάστατος Πίνακας) Παράδειγμα #include <stdio.h> #include <stdlib.h> int main() { } int *a = NULL; int n; printf("enter Matrix (nxn) Size:"); scanf("%d", &n); int k = 0; a = (int *) malloc(n * n * sizeof(int)); for (int i=0; i<n; i++) for (int j=0; j<n; j++) free(a); return 0; a[i*n + j] = ++k; Δημιουργία δυναμικού m-d πίνακα Η Λύση αυτή θα βελτιωθεί στη Διάλεξη-10 έτσι ώστε να αναφερόμαστε στα στοιχεία του πίνακα ως a[i][j]! 9-23

Προχωρημένες Συναρτήσεις (H Συναρτήσεις calloc/realloc) Είχαμε πει ότι η βιβλιοθήκη <stdlib.h> ορίζει τρεις συναρτήσεις (κλήσεις συστήματος) για να εκχωρηθεί μνήμη από τον πυρήνα του Λειτουργικού Συστήματος : malloc: Δεσμεύει ένα block μνήμης (μετριέται σε bytes) αλλά ΔΕΝ τον αρχικοποιεί. calloc: Δεσμεύει ένα block μνήμης και το αρχικοποιεί (με τον χαρακτήρα '\0'). realloc: Αλλάζει το μέγεθος ενός προηγούμενου δεσμευμένου μπλοκ μνήμης. Ας δούμε λίγο αναλυτικότερα τα πρότυπα των συνάρτησαν αυτών. 9-24

Η Συνάρτηση calloc Πρότυπο malloc: void *malloc(size_t size); Πρότυπο calloc: void *calloc(size_t nmemb, size_t size); typedef struct { int x, y; } POINT; POINT *p = NULL; p = (POINT *) calloc(1, sizeof(point)); Χαρακτηριστικά calloc: Δεσμεύει χώρο για ένα πίνακα με nmemb στοιχεία, το κάθε ένα με εκ των οποίων είναι size bytes μακρύ. Επιστρέφει ένα NULL δείκτη εάν δεν υπάρχει ο αιτούμενος χώρος. Αρχικοποιεί τον δεσμευμένο χώρο θέτοντας όλα τα διφυία (bits) σε 0. (ένας πίνακας από pointers δεν αρχικοποιείται απαραίτητα σε πίνακα από NULLs... Εξαρτάται από την αναπαράσταση) 9-25

Η Συνάρτηση realloc Πρότυπο realloc: void *realloc(void *ptr, size_t size); ΛΑΘΟΣ ΧΡΗΣΗ (αύξηση πίνακα κατά 5 θέσεις) ip = realloc(ip, sizeof(int) * (SIZE + 5)); ΟΡΘΗ ΧΡΗΣΗ (αύξηση πίνακα κατά 5 θέσεις) int *tmp = realloc(ip, sizeof(int) * (SIZE + 5)); if (tmp == NULL) { fprintf(stderr, "ERROR: realloc failed"); } ip = tmp; 9-26

Η Συνάρτηση realloc Χαρακτηριστικά realloc: void *realloc(void *ptr, size_t size); Αναπροσαρμόζει το μέγεθος ενός προηγούμενα δεσμευμένου πίνακα (μετακινώντας τον πίνακα σε νέο σημείο της μνήμης εάν χρειάζεται). ptr πρέπει να δείχνει σε διεύθυνση που λήφθηκε από προηγούμενη κλήση malloc, calloc, ή realloc. To size μπορεί να είναι μεγαλύτερο ή μικρότερο (με όποιες συνέπειες ακολουθούν) από το αρχικό μέγεθος 9-27