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

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

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

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

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

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

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

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

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

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

C: Από τη Θεωρία στην Εφαρμογή

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

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

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

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

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

Η γλώσσα προγραμματισμού C

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

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

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

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

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

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

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

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

H ΓΛΩΣΣΑ C. Μάθηµα 12: υναµική έσµευση Μνήµης. ηµήτρης Ψούνης

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

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

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

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

Η γλώσσα προγραμματισμού C

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

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

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

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

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

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

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

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

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

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

Η γλώσσα προγραμματισμού C

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

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

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

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

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

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

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

Οι δείκτες στη γλώσσα C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ

Η γλώσσα προγραμματισμού C

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

Η γλώσσα προγραμματισμού C

ΕΡΓΑΣΤΗΡΙΟ 1 - ΣΗΜΕΙΩΣΕΙΣ

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

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

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

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

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

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

12. Συναρτήσεις (Μέρος ΙI)

Η γλώσσα προγραμματισμού C

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

Η γλώσσα προγραμματισμού C

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

Ενδεικτική περιγραφή μαθήματος

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

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

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

Εργαστήριο 9: Αρχεία

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. ( ιάλεξη 13) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

Η γλώσσα προγραμματισμού C

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

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

Η γλώσσα προγραμματισμού C

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

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

Η γλώσσα προγραμματισμού C

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

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

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

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

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

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

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

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

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

Η γλώσσα προγραμματισμού C

Εργαστήριο 2ο. Περίγραμμα Εργαστηριακής Άσκησης

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

Transcript:

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

Κατηγορίες μνήμης εκτελέσιμου προγράμματος Στις καθολικές και στατικές μεταβλητές οι χώροι μνήμης δεσμεύονται κατά την διάρκεια της μεταγλώττισης. Οι τοπικές μεταβλητές δεσμεύονται προσωρινά όσο διαρκεί η εκτέλεση της συνάρτησης που τις περιέχει. Όταν εκτελείται ένα πρόγραμμα η μνήμη που καταλαμβάνει χωρίζεται τυπικά σε 4 μέρη: Στη μνήμη που καταλαμβάνει ο εκτελέσιμος κώδικας (code area). Στη μνήμη για τις καθολικές και στατικές μεταβλητές (global area). Στη μνήμη όπου αποθηκεύονται οι τοπικές μεταβλητές και οι παράμετροι συναρτήσεων. Ονομάζεται «στοίβα» (stack). Στη μνήμη για τις μεταβλητές που δεσμεύονται με δυναμική διαχείριση. Πρόκειται για ελεύθερη μνήμη και ονομάζεται «σωρός» (heap). 2

Ο σωρός (heap) Ελεύθερη μνήμη που δεν χρησιμοποιείται από κανένα άλλο πρόγραμμα (ούτε από το λειτουργικό σύστημα). Παρέχει τμήματα μνήμης όποτε ζητηθούν από το πρόγραμμα (δυναμική εκχώρηση). Αξιοποιώντας τον σωρό μπορεί κάποιος να κάνει εξοικονόμηση μνήμης. Ο χώρος που καταλαμβάνει ο σωρός εξαρτάται από τον μεταγλωττιστή. Συνήθως είναι αρκετά μεγάλος, αλλά όχι απεριόριστος. Η πρόσβαση στο τμήμα του σωρού είναι πιο αργή σε σχέση με αυτή της στοίβας. Είναι ευθύνη του προγραμματιστή η αποτελεσματική διαχείριση μνήμης. Είναι δυνατή η αλλαγή μεγέθους μεταβλητής. Τοπικές μεταβλητές. Στοίβα (stack) Σωρός (heap) Καθολικές στατικές μεταβλητές (global area) Εκτελέσιμο πρόγραμμα (code area) 3

Δυναμική διαχείριση μνήμης Μέχρι τώρα στα προγράμματα μας αναθέταμε τη μεγαλύτερη μνήμη που ενδεχόμενα χρειαζόταν οι μεταβλητές μας: #define Ν 100.. Στατική δέσμευση μνήμης (στη στοίβα) int Pin[Ν]; //δήλωση πίνακα. Το μέγεθος δεν μπορεί ν αλλάξει Η δήλωση της μεγαλύτερης πιθανής μνήμης έχει επιπτώσεις στην εξοικονόμηση μνήμης και σε ταχύτητα εκτέλεσης. Η λύση σε ένα τέτοιο ενδεχόμενο (δηλαδή όταν είναι άγνωστο το μέγεθος της μνήμης που θα χρειαστούμε) είναι η δυναμική δέσμευση μνήμης (dynamic memory allocation). Στη βιβλιοθήκη stdlib.h υπάρχουν συναρτήσεις με τις οποίες μπορούμε να ζητήσουμε δυναμικά την παραχώρηση και την αποδέσμευση χώρου μνήμης από τον σωρό. Πολύ χρήσιμο όταν δεν γνωρίζουμε εκ των προτέρων το μέγεθος της μνήμης που χρειαζόμαστε. 4

Συναρτήσεις για δυναμική διαχείριση μνήμης malloc () calloc () realloc () free () Δυναμική δέσμευση συγκεκριμένου πλήθους bytes Δυναμική δέσμευση πλήθους τμημάτων μνήμης Αλλαγή μεγέθους τμήματος δεσμευμένης μνήμης Απελευθέρωση μνήμης που δεσμεύτηκε δυναμικά Η διαχείριση μνήμης γίνεται με αίτημα προς το λειτουργικό σύστημα. Η μέγιστη μνήμη που μπορούμε να ζητήσουμε εξαρτάται από: την συνολική μνήμη του συστήματος, πόση μνήμη είναι διαθέσιμη για προγράμματα χρηστών, πόσα άλλα προγράμματα τρέχουν ταυτόχρονα και πόση μνήμη έχουν δεσμεύσει. Με την δυναμική διαχείριση μνήμης, εκτός του ότι δεν χρειάζεται να γνωρίζουμε το μέγεθος της μνήμης που θα χρειαστεί, μπορούμε επίσης ν αλλάξουμε αυτό το μέγεθος. 5

Η συνάρτηση malloc() memory allocation Για τη δέσμευση τμήματος μνήμης στο σωρό (heap). Δέχεται σαν όρισμα το μήκος του τμήματος σε bytes. Το πρωτότυπο της συνάρτησης: void *malloc(size_t size); Παράμετρος size: πόσα bytes θα δεσμευτούν Τύπος size_t: συνώνυμο του unsigned integer. Η malloc() επιστρέφει ένα δείκτη στη μνήμη που δεσμεύτηκε (στο 1 ο byte). Αυτός ο δείκτης είναι τύπου void (void *). Αν δεν υπάρχει επαρκής μνήμη, τότε επιστρέφει ένα κενό (NULL) δείκτη. Πρέπει πάντα να γίνεtαι αυτός το έλεγχος: Χρήση του NULL δείκτη ίσως προκαλέσει κατάρρευση του προγράμματος p = (float *) malloc(40); if (p==null) { //if (!p) printf("allocation error"); exit (1); 6

Πρόγραμμα με χρήση της malloc() #include <stdio.h> #include <stdlib.h> #include <string.h> main() { char *str; str = (char *) malloc(15); if (!str){ printf("allocation error"); exit (1); strcpy(str, "TEI of Crete"); puts(str); printf("%c\n", str[0]); putchar(str[1]); free(str); getchar();getchar(); Στο πρόγραμμα δεσμεύονται 15 χαρακτήρες (bytes) Καλύτερα: str = (char *) malloc(15*sizeof(char)); Μπορείτε και: gets(str) Στη πραγματικότητα δημιουργείται δυναμικά ένας μονοδιάστατος πίνακας χαρακτήρων! Το τμήμα μνήμης αποδεσμεύεται 7

Η συνάρτηση free() Η συνάρτηση free() καλείται για την απελευθέρωση κάποιας δεσμευμένης μνήμης. Πρωτότυπο της συνάρτησης: Χρήση: free(ptr); void free(void *ptr); Η παράμετρος ptr δείχνει στη αρχή του τμήματος της μνήμης που πρόκειται ν απελευθερωθεί με τη free(). Όταν τελειώνει ένα πρόγραμμα η δεσμευμένη μνήμη αποδεσμεύεται αυτόματα. Όμως εάν δεν χρειαζόμαστε την μνήμη που δεσμεύσαμε τότε καλύτερα να την αποδεσμεύουμε με τη συνάρτηση free(). Αν ο δείκτης-παράμετρος της free() ΔΕΝ δείχνει σε δυναμικά δεσμευμένη μνήμη, τότε προκαλείται πρόβλημα στην εκτέλεση του προγράμματος (όπως επίσης αν αποπειραθούμε να ελευθερώσουμε μνήμη που έχει ήδη αποδεσμευτεί). 8

Ο δείκτης τύπου void (void *) O δείκτης void υποδηλώνει ότι δεν είναι γνωστό το είδος της μνήμης που δεσμεύεται (γενικός δείκτης). Επιτρέπει στη συνάρτηση να επιστρέφει δείκτη σε μνήμη χωρίς να προσδιορίζεται ο τύπος δεδομένων που θα φιλοξενηθούν. Στο προηγούμενο πρόγραμμα στη εντολή: str = (char *) malloc(15); μετατρέπεται ο δείκτης void σε δείκτη δεδομένων τύπου χαρακτήρα. Αν και δεν είναι απαραίτητο στην ANSI C, η πρακτική αυτή προτείνεται για λόγους συμβατότητας με τη C++. Είναι διαφορετικός από το void: void - δεν επιστρέφει τίποτα η συνάρτηση. void * - απλά επιστρέφεται μια διεύθυνση μνήμης χωρίς να είναι γνωστό τι τύπου δεδομένα θα αποθηκευτούν εκεί. 9

Η συνάρτηση calloc() clear memory allocation H calloc() όπως και η malloc() μας δίνει την δυνατότητα να δεσμεύσουμε μνήμη. Το πρωτότυπο: void *calloc(size_t num, size_t size); Το ποσό της μνήμης που δεσμεύεται είναι: num*size (ουσιαστικά μια διάταξη από num στοιχεία που το καθένα τους έχει μέγεθος size). Παράδειγμα χρήσης: Όπως και στη malloc() αν δεν υπάρχει επαρκής μνήμη επιστρέφει ένα NULL (κενό) δείκτη. ptr = (int *) calloc(15, sizeof(int)); if (!ptr){ printf("allocation error"); exit (1); Δέσμευση 60 bytes Η calloc() σε αντίθεση με την malloc() δίνει μηδενικές αρχικές τιμές στη μνήμη που δεσμεύει. 10

Πρόγραμμα με χρήση της calloc() #include <stdio.h> #include <stdlib.h> main() { char *str; str = (char *) calloc(15, sizeof(char)); if (!str){ printf("allocation error"); exit (1); printf("string is zero: "); puts(str); printf("give me a string:"); gets(str); printf("new string: "); puts(str); printf("%c\n", str[0]); putchar(str[1]); free(str); getchar();getchar(); Στο πρόγραμμα δεσμεύονται 15 χαρακτήρες (bytes) Με malloc: str = (char *) malloc(15*sizeof(char)); Προσοχή: αν δώσουμε putchar(str[20]); δεν θα βγει προφανώς σωστό αποτέλεσμα (εκτός ορίων!) 11

Η συνάρτηση realloc() [memory] reallocation Με την realloc() μπορούμε να αλλάξουμε το μέγεθος μιας ήδη δεσμευμένης μνήμης. Πρωτότυπο: void *realloc(void ptr, size_t size); Η παράμετρος ptr δείχνει στη αρχή του τμήματος της μνήμης που έχει ήδη δεσμευτεί (pointer). Η τιμή της παραμέτρου size μπορεί να είναι μεγαλύτερη ή μικρότερη από το αρχικό μέγεθος μνήμης που δεσμεύτηκε αρχικά. Η συνάρτηση επιστρέφει ένα δείκτη σε περιοχή μνήμης. Η διεύθυνση μπορεί να είναι διαφορετική από την αρχική - αν δεν βρεθεί αρκετός χώρος στη αρχική διεύθυνση, η realloc() μεταφέρει το τμήμα της μνήμης σε άλλη διεύθυνση. 12

Πρόγραμμα με τη συνάρτηση realloc() #include <stdio.h> #include <stdlib.h> #include <string.h> main() { char *str; str = (char *) malloc(15*sizeof(char)); if (!str){ printf("allocation error"); exit (1); strcpy(str, "TEI of Crete"); printf("string = %s, physical address = %p\n", str, str); str = (char *) realloc(str, 50*sizeof(char)); strcat(str, ", Electrical Engineering"); printf("string = %s, physical address = %p\n", str, str); free(str); Στο πρόγραμμα δεσμεύονται αρχικά 15 bytes. Στη συνέχεια 50. Αποδέσμευση μνήμης Αρχική δέσμευση Και εδώ πρέπει να γίνεται έλεγχος Αλλαγή του μεγέθους της μνήμης (μεγαλύτερο) 13

Προσοχή με την επιστροφή της realloc() Κανονικά η τιμή που επιστρέφει η realloc() δεν πρέπει ν ανατίθεται στον ίδιο δείκτη της μνήμης που δεσμεύτηκε αρχικά. Αυτό διότι σε περίπτωση αποτυχίας της realloc() θα επιστραφεί η τιμή NULL, με αποτέλεσμα να χαθούν τυχόν δεδομένα που αποθηκεύτηκαν. Είναι καλύτερα ν αναθέτουμε επιστροφή της realloc() σε έναν άλλο (προσωρινό) δείκτη και αν ο έλεγχος είναι επιτυχής τότε η διεύθυνση του νέου χώρου εκχωρείται στον αρχικό δείκτη: char *str, *tmpstr; str = (char *) malloc(15*sizeof(char)); tmpstr = (char *) realloc(str, 50*sizeof(char)); if (tmpstr ==NULL) printf ("realloc: Allocation error"); else str=tmpstr; 14

Δεσμεύοντας μνήμη για δομές struct stud { int id; char name[30]; ; main(){ struct stud *ptr; int i,n; printf("enter n: "); scanf("%d",&n); ptr=(struct stud*)malloc(n*sizeof(struct stud)); for(i=0;i<n;++i){ printf("student %d ===\n",i+1); printf(" Enter name:"); scanf("%s",&(ptr+i)->name); printf(" Enter ID:"); scanf("%d",&(ptr+i)->id); printf("\ndisplaying Info:\n"); for(i=0;i<n;++i) printf("%s\t%d\t\n",(ptr+i)->name,(ptr+i)->id); free(ptr); Στο πρόγραμμα δεσμεύεται μνήμη για n δομές. Το n δίνεται από τον χρήστη Δέσμευση μνήμης για n δομές τύπου stud 15

Δυναμική δημιουργία μονοδιάστατων πινάκων int *p,i,n; printf("how many? "); scanf("%d", &N); p = (int *) malloc(n*sizeof(int)); if (!p){ printf("allocation error"); exit (1); for (i=0;i<n;i++) { printf("please give %d:",i+1); scanf("%d",&p[i]); printf("allocated: "); for (i=0;i<n;i++) { printf("%d ",p[i]); free(p); Στο πρόγραμμα δεσμεύονται Ν ακέραιοι Εναλλακτικά: scanf("%d", p+i); Εναλλακτικά: printf("%d ", *(p+i)); Το τμήμα μνήμης αποδεσμεύεται Η δέσμευση Ν ακεραίων. Ουσιαστικά έχει δημιουργηθεί δυναμικά ένας μονοδιάστατος πίνακας Ν ακεραίων! 16

Δυναμική δημιουργία 2Δ πινάκων int **p,i,j, M, N; printf("line size:"); scanf("%d", &M); p = (int **) malloc(m*sizeof(int *)); //δέσμευση Μ γραμμών if (p == NULL){ printf("malloc lines: Error\n"); exit(1); printf("column size:"); scanf("%d", &N); for (i=0;i<m;i++) { p[i]= (int *) malloc(n*sizeof(int *)); //δέσμευση Ν στηλών ανά γραμμή if (p == NULL){ printf("malloc column:%d Error\n",i); exit(1); for (i=0;i<m;i++) for (j=0;j<n;j++) p[i][j]=rand()%20; for (i=0;i<m;i++){ for (j=0;j<n;j++) printf("%5d", p[i][j]); printf("\n"); for (i=0;i<m;i++) free(p[i]); free(p); 17

str[] ή *str (διαφορές) και εγγραφή σε αρχείο main () { FILE *fp; int c; char str []="Hello!"; if ((fp=fopen("store.txt", "w+"))==null){ printf("error opening file!"); exit(1); fputs(str, fp); fclose(fp); if ((fp=fopen("store.txt", "r"))==null) { printf("error opening file!"); exit(1); if( fgets (str, 7, fp)!=null ) puts(str); fclose(fp); main () { FILE *fp; char *str; if ((fp=fopen("store.txt", "w+"))==null) { printf("error opening file!"); exit(1); str="hello!"; fputs(str, fp); fclose(fp); if ((fp=fopen("store.txt", "r"))==null) { printf("error opening file!"); exit(1); str = (char*)malloc(7); if( fgets (str, 7, fp)!=null ) puts(str); fclose(fp); getchar();getchar(); 18

Πόση μνήμη έχω ακόμα? #include <stdio.h> #include <stdlib.h> main() { char *str; long MEM; MEM=0; do { str = (char *) malloc(1000); if (str) MEM += 1000; while (str); printf ("About %ld bytes of free memory! ",MEM); free(str); getchar();getchar(); 19