ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΓΛΩΣΣΑ C Dynamic Memory Allocation (Δυναμική Παραχώρηση Μνήμης) ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Παραχώρηση μνήμης ΣΤΑΤΙΚΗ ΠΑΡΑΧΩΡΗΣΗ (STATIC ALLOCATION) Είναι η παραχώρηση χώρου μνήμης που γίνεται κατά τη διάρκεια της μεταγλώττισης (compile time). ΔΥΝΑΜΙΚΗ ΠΑΡΑΧΩΡΗΣΗ (DYNAMIC ALLOCATION) Είναι η παραχώρηση χώρου μνήμης που γίνεται κατά τη διάρκεια της εκτέλεσης (run time) με χρήση κατάλληλων συναρτήσεων. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Δυναμικά παραχωρούμενη μνήμη σημαίνει ότι ένα πρόγραμμα, καθώς εκτελείται ζητά από τον υπολογιστή να του παραχωρήσει ένα τμήμα της κεντρικής του μνήμης, αρκετά μεγάλο ώστε να μπορεί να διακρατήσει μια μεταβλητή ενός προκαθορισμένου τύπου δεδομένων. Ο υπολογιστής τότε επιστρέφει στο πρόγραμμα τη διεύθυνση της μνήμης που εκχωρεί στο πρόγραμμα. Το πρόγραμμα μπορεί να έχει πρόσβαση στο τμήμα αυτό της μνήμης ΜΟΝΟΝ μέσω της διεύθυνσης ΔΗΛΑΔΗ πρέπει να χρησιμοποιήσει έναν ΔΕΙΚΤΗ! ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Συνήθως η δυναμική παραχώρηση της μνήμης δεν αφορά μεμονωμένες μεταβλητές αλλά πίνακες. Σε πολλές περιπτώσεις, όταν γράφεται ο πηγαίος κώδικας (δηλ. το πρόγραμμα) το μέγεθος ενός πίνακα που θα χρησιμοποιηθεί δεν είναι εξ αρχής γνωστό, παρά μόνον όταν ξεκινήσει η εκτέλεση του προγράμματος. Αυτό συμβαίνει όταν το πλήθος των δεδομένων καθορίζεται από τον χρήστη του προγράμματος. Όταν ένας πίνακας εκχωρείται δυναμικά δεν δεσμεύεται χώρος γι’ αυτόν (όπως συμβαίνει με τους στατικούς πίνακες) αλλά η δέσμευση γίνεται μόλις καθοριστεί το μέγεθός του. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Όταν η ποσότητα μνήμης που απαιτείται δεν είναι δυνατόν να παραχωρηθεί τότε η αντίστοιχη συναρτηση επιστρέφει ως διεύθυνση την τιμή 0 που αντιστοιχεί στην τιμή NULL του δείκτη. Είναι απαραίτητος ο έλεγχος για τη δυνατότητα παραχώρησης της μνήμης πριν γίνει οποιαδήποτε προσπάθεια χρήσης της ! ! ! Όταν ένα πρόγραμμα ολοκληρώσει τη χρήση της δυναμικής μνήμης πρέπει να επιστρέφει την ποσότητα αυτή στο σύστημα ώστε να είναι διαθέσιμη για μελλοντική χρήση. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
In programming we may come across situations where we may have to deal with data, which is dynamic in nature. The number of data items may change during the executions of a program. The number of customers in a queue can increase or decrease during the process at any time. When the list grows we need to allocate more memory space to accommodate additional data items. Such situations can be handled move easily by using dynamic techniques. Dynamic data items are created at run time, thus optimizing file usage of storage space. The process of allocating memory at run time is known as dynamic memory allocation. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Introduction Many languages permit a programmer to specify an array size at run time. Such languages have the ability to calculate and assign during executions, the memory space required by the variables in the program. C inherently does not have this facility but supports with memory management functions, which can be used to allocate and free memory during the program execution. The following functions are used in c for purpose of memory management. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Function Task Functions malloc calloc free realloc Allocates memory requests size of bytes and returns a pointer to the 1st byte of allocated space calloc Allocates space for an array of elements initializes them to zero and returns a pointer to the memory free Frees previously allocated space realloc Modifies the size of previously allocated space. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
malloc malloc requires one argument - the number of bytes you want to allocate dynamically. If the memory allocation was successful, malloc will return a void pointer - you can assign this to a pointer variable, which will store the address of the allocated memory. If memory allocation failed (for example, if you're out of memory), malloc will return a NULL pointer. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
#include <stdio.h> #include <stdlib.h> /* required for the malloc and free functions */ int main() { int number, *ptr , i; printf("How many ints would you like store? "); scanf_s("%d", &number); ptr = malloc(number*sizeof(int)); /* allocate memory */ if(ptr!=NULL) { for(i=0 ; i<number; i++) *(ptr+i) = i; for(i=number ; i>0 ; i--) { printf("%d\n", *(ptr+(i-1))); /* print out in reverse order */ } free(ptr); /* free allocated memory */ return 0; } else { printf("\nMemory allocation failed - not enough memory.\n"); return 1; } ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
ΠΑΡΑΧΩΡΗΣΗ ΜΝΗΜΗΣ – συνάρτηση malloc( ) Η συνάρτηση παραχώρησης μνήμης malloc( ) απαιτεί τη δήλωση #include <stdlib.h> Όρισμα της συνάρτησης είναι το πλήθος θέσεων μνήμης (bytes) Επιστρέφει τη διεύθυνση του πρώτου byte του μπλοκ μνήμης που έχει δεσμεύσει ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04Β
/*παραχώρηση μνήμης για πίνακα ακεραίων 15 θέσεων*/ ΠΑΡΑΔΕΙΓΜΑ /*παραχώρηση μνήμης για πίνακα ακεραίων 15 θέσεων*/ int *numbers; numbers=(int*) malloc(15 * sizeof(int)) ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Παρατηρήσεις Μη δεσμεύετε περισσότερη μνήμη από όση χρειάζεστε. Μην εκχωρείτε ένα νέο αλφαριθμητικό (string) σε πίνακα χαρακτήρων με μικρότερο δεσμευμένο μέγεθος. Θα χαθούν χαρακτήρες. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Ασκηση Μια σειρά δεδομένων πρέπει να αποθηκευτεί σε ένα δισδιάστατο πίνακα αλλά δεν είναι γνωστό ούτε το πλήθος των γραμμών ούτε το πλήθος των στηλών. Οι τιμές τους δίνονται κατά τη διάρκεια εκτέλεσης του προγράμματος. Να γραφεί ένα πρόγραμμα σε γλώσσα C που θα εισάγει τιμές (ακέραιες) σε ένα τέτοιο πίνακα και στη συνέχεια θα τις εμφανίζει. ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04
Λύση #include <stdio.h> #include <stdlib.h> int *intptr, num_entries,num_cols,i,j; void main() { printf("how many entries ?"); scanf_s("%d",&num_entries); printf("how many columns? "); scanf_s("%d",&num_cols); intptr=(int*)calloc(num_entries*num_cols,sizeof(int)); if (intptr!=NULL) printf(" enter your values :\n"); for (i=0;i<num_entries*num_cols;i++) scanf_s("%d",&intptr[i]); for (i=0;i<num_entries;i++) { for (j=0;j<num_cols;j++) printf("%4d ", intptr[i*num_cols+j]); printf("\n\n"); } ΔΠΘ-ΜΠΔ: ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ / 04