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

Σχετικά έγγραφα
Προγραμματισμός Η/Υ (ΤΛ2007 )

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

είκτες και Πίνακες (2)

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

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

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

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

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

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

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

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

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

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

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

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

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

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

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (Programming in the large)

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

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

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

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

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

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

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

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

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language)

ΗΓλώσσαΠρογραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Ελένη Τουσίδου, Ph.D.

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

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

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

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Η γλώσσα C. Δείκτες (pointers)

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ II. Υφαντόπουλος Νικόλαος Υποψήφιος Διδάκτορας Contact:

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

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

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

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

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

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

Επανάληψη για τις Τελικές εξετάσεις

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

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

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

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

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

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

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

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

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

Επεξεργασία Αρχείων Κειµένου

Δομημένος Προγραμματισμός

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

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

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

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δομημένος Προγραμματισμός

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

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

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Συναρτήσεις. Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων

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

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

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

Μεταβλητές. Έστω η μεταβλητή

Αντικειµενοστρεφής Προγραµµατισµός

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

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

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

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

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

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

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

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

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

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

υναµικές οµές εδοµένων

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

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

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

Η γλώσσα C. Δείκτες (pointers)

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

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

Διαδικασία Ανάπτυξης Λογισμικού

Transcript:

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

Ανασκόπηση της C είκτες Πίνακες Κλήση συναρτήσεων Συµβολοσειρές οµές υναµική καταχώρηση µνήµης Συχνά προγραµµατιστικά σφάλµατα οµή Προγράµµατος Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 2

Μνήµη Υπολογιστή Η µνήµη του υπολογιστή µπορεί να θεωρηθεί ως αριθµηµένη ακολουθία από µονάδες αποθήκευσης Κάθε µονάδα µπορεί να αποθηκεύσει 1 byte ιεύθυνση µιας µονάδας είναι η θέση της στην ακολουθία µονάδες αποθήκευσης i i+1 διευθύνσεις µονάδων Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 3

Μια µεταβλητή Μεταβλητές Εχει συµβολικό όνοµα Τύπο δεδοµένων Καταλαµβάνει µια ή περισσότερες µονάδες αποθήκευσης Εχει διεύθυνση τη θέση της πρώτης µονάδας αποθήκευσης Π.χ. int p; µεταβλητή p i i+1 διεύθυνση µεταβλητής Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 4

Ο δείκτης είναι µεταβλητή είκτες Αποθηκεύει τη διεύθυνση µιας µονάδας αποθήκευσης Εχει τύπο που καθορίζει τη χρήση της µνήµης που δείχνει ηλώνεται µε το σύµβολο * Π.χ. int *ip; δείκτης ip διεύθυνση µεταβλητής τύπου int Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 5

Προσπέλαση είκτη Τελεστής αναφοράς & (reference) Προσπέλαση της διεύθυνσης µιας µεταβλητής Τελεστής έµµεσης αναφοράς * (dereference) Προσπέλαση της µεταβλητής που δείχνεi o δείκτης ιαφορετικός από το συµβολισµό δήλωσης του δείκτη Π.χ. int *ip; int x = 1; ip = &x; *ip = 2; δείκτης ip µεταβλητή x 1 2 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 6

Dangling Reference Απλή δήλωση δείκτη δεν καταχωρεί µνήµη αναφοράς Έµµεση αναφορά χωρίς αρχικοποίηση του δείκτη Προσπάθεια προσπέλασης απροσδιόριστης διεύθυνσης Πρόωρος τερµατισµός εκτέλεσης κώδικα από το σύστηµα Π.χ. int *ip; *ip = 2; δείκτης ip απροσδιόριστη διεύθυνση πρόωρος τερµατισµός Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 7

είκτης NULL Ειδική σταθερά δείκτη Ισοδυναµεί µε το 0 Υποδηλώνει µια ανύπαρκτη µεταβλητή Έµµεση αναφορά µέσω NULL οδηγεί σε τερµατισµό Π.χ. int *ip; δείκτης ip ip = NULL; Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 8

είκτες και Πίνακες Η δήλωση ενός πίνακα καταχωρεί στη µνήµη µια σειρά από µεταβλητές του ίδιου τύπου (στοιχεία του πίνακα) Ο συµβολισµός δείκτη προσφέρει έναν εναλλακτικό (ταχύτερο) τρόπο προσπέλασης των στοιχείων πίνακα Π.χ. int a[5]; a[0] a[1] a[2] a[3] a[4] *a *(a+1) *(a+2) *(a+3) *(a+4) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 9

Αριθµητική εικτών Ένας δείκτης µε κατάλληλη αρχικοποίηση µπορεί να προσπελάσει τα στοιχεία ενός πίνακα ίδιου τύπου Όταν ο δείκτης pa δείχνει κάποιο στοιχείο ενός πίνακα, ο δείκτης pa+i δείχνει στο στοιχείο i θέσεις δεξιά, και ο δείκτης pa-i δείχνει στο στοιχείο i θέσεις αριστερά Π.χ. int a[5]; int *pa; πίνακας a τύπου int pa = &a[2]; a+2 *(pa-2) *(pa-1) *pa *(pa+1) *(pa+2) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 10

Κλήση κατ Αξία (by value) Aντιγράφει τις τιµές των ορισµάτων a και b στις τοπικές µεταβλητές x και y Αφήνει ίδιες τις τιµές των µεταβλητών a, b void swap(int x, int y) { int temp; swap : x 1 2 } temp = x; x = y; y = temp; y a 2 1 1 int a = 1, b = 2; b 2 swap(a,b); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 11

Κλήση κατ αναφορά (by reference) Eπιτρέπει προσπέλαση των ορισµάτων a και b µέσω των τοπικών µεταβλητών - δεικτών -pxκαι py Εναλλάσσει τις τιµές των µεταβλητών a, b void swap(int *px, int *py) { int temp; } temp = *px; *px = *py; *py = temp; int a = 1, b = 2; swap(&a, &b); swap : px py a b 1 2 2 1 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 12

Συµβολοσειρές (strings) Πίνακες τύπου char µε τελευταίο στοιχείο το \0 Π.χ. char astring[] = Hello world ; astring: H e l l o w o r l d \0 Παράδειγµα συνάρτησης αντιγραφής συµβολοσειρών void strcopy(char *s, char *t) { int i = 0; while ((s[i] = t[i])!= /0 ) i++; } char a[] = Hello world, b[12]; strcopy(b, a); a b H e l l o w o r l d \0 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 13

Συµβολοσειρές και είκτες Οι δείκτες συντοµεύουν τη διαχείριση συµβολοσειρών Π.χ. συντοµότερη εκδοχή της συνάρτησης αντιγραφής void strcopy(char *s, char *t) { while (*s++ = *t++) ; } char a[] = Hello world, b[12]; strcopy(b, a); a b H e l l o w o r l d \0 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 14

είκτες σε Πίνακες (ή είκτες σε είκτες) Θεωρούµε δύο δείκτες σε ξεχωριστές συµβολοσειρές Θέλουµε να γράψουµε συνάρτηση που εναλλάσσει τις συµβολοσειρές στις οποίες δείχνουν οι δύο δείκτες Πριν Μετά a Hello world\0 a Hello world\0 b Good bye\0 b Good bye\0 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 15

Εναλλαγή Συµβολοσειρών Για να προσπελάσουµε τις συµβολοσειρές µέσα από συνάρτηση χρησιµοποιούµε ορίσµατα τύπου char ** void strswap(char **pa, char **pb) { char *temp; } temp = *pa; *pa = *pb; *pb = temp; pa pb a b Hello world\0 Good bye\0 char *a = Hello world ; char *b = Good bye ; strswap(&a, &b); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 16

Πίνακες εικτών Ένα πρόγραµµα µπορεί να προσπελάσει παραµέτρους της γραµµής εκτέλεσης εντολών Π.χ. C:> echo Hello, world Η προσπέλαση γίνεται µέσω ορισµάτων της main() #include <stdio.h> int main(int argc, char **argv) { int i; } argv for (i = 1; i < argc; i++) printf(( %s%s, argv[i], (i < argc 1)? : ); printf( \n ); exit(0); 0 1 argc-1 echo\0 Hello,\0 world\0 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 17

οµή Συλλογή µιας ή περισσότερων µεταβλητών (µελών) ενδεχοµένως διαφορετικών τύπων δεδοµένων ηλώνεται µε τη δεσµευµένη λέξη struct struct point { struct point { int x; int x; int y; ή int y; }; } pt1, pt2; struct point pt1, pt2; pt1 x y pt2 x y Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 18

Λειτουργίες µε οµές Υποστηρίζονται Αρχικοποίηση µε λίστα σταθερών Π.χ. struct point pt1 = {1, 2}; Αντιγραφή και απόδοση τιµής σαν σύνολο Π.χ. pt2 = pt1; Προσπέλαση µελών Π.χ. printf( %d %d, pt1.x, pt1.y); Αναφορά στη δοµή σαν σύνολο, ή σε ξεχωριστά µέλη της δοµής Π.χ. struct point *ppt = &pt1; int *z = &(pt1.x); εν υποστηρίζεται γενικά Σύγκριση δοµών σαν σύνολο Π.χ. (pt1 == pt2) Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 19

Η δήλωση µιας δοµής Αυτοαναφορικές οµές εν µπορεί να έχει ως µέλος δοµή του ίδιου τύπου Mπορεί όµως να περιέχει δείκτη σε δοµή του ίδιου τύπου /* άκυρη */ /* έγκυρη */ struct S { struct S { int a; int a; struct S next; struct S *next; } s; } s; Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 20

typedef Εναλλακτικά µπορούµε να δηλώσουµε µια αυτοαναφορική δοµή κάνοντας χρήση της δεσµευµένης λέξης typedef typedef struct S *Sptr; typedef struct S { int a; Sptr next; } Sstruct; Sstruct s; a s Sptr Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 21

Καταχώρηση Μνήµης (1) Τοπική Μνήµη (local memory, stack) Χρησιµοποιείται από τις τοπικές µεταβλητές των συναρτήσεων Καταχωρείται αυτόµατα κατά την κλήση µιας συνάρτησης Αποδεσµεύεται αυτόµατα κατά την έξοδο από µια συνάρτηση Το µέγεθος καθορίζεται από τους τύπους των µεταβλητών Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 22

Χρήση Τοπικής Μνήµης void X() { void Y(int p) { int a = 1; int q; int b = 2; q = p + 2; } Y(a); Y(b); } Y(a) p:1 q:3 Y(b) p:2 q:4 X() a:1 b:2 X() a:1 b:2 X() a:1 b:2 X() a:1 b:2 X() a:1 b:2 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 23

Σφάλµα Χρήσης Τοπικής Μνήµης // Επιστρέφει δείκτη σε int int* TAB() { int temp; // είκτης σε τοπική µεταβλητή int return(&temp); } void Victim() { int* ptr; ptr = TAB(); *ptr = 42; // Σφάλµα εκτέλεσης! } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 24

Καταχώρηση Μνήµης (2) υναµική Μνήµη (heap) Η καταχώρηση ελέγχεται από το χρήστη H αποδέσµευση ελέγχεται από το χρήστη Το δεσµευµένο µέγεθος καθορίζεται από το χρήστη Αυξάνει την πιθανότητα σφαλµάτων προγραµµατισµού! Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 25

Καταχώρηση υναµικής Μνήµης Τοπικές µεταβλητές-δείκτες δείχνουν σε τµήµατα της δυναµικής µνήµης που έχουν δεσµευτεί Τοπική Μνήµη υναµική Μνήµη ιαθέσιµη Μεταβλητή 3 Μεταβλητή 2 Μεταβλητή 1 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 26

Αποδέσµευση υναµικής Μνήµης Τοπικές µεταβλητές-δείκτες δείχνουν σε τµήµατα δυναµικής µνήµης ακόµη και µετά την αποδέσµευση Τοπική Μνήµη υναµική Μνήµη ιαθέσιµη Μεταβλητή 3 ιαθέσιµη Μεταβλητή 1 Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 27

Λειτουργίες υναµικής Μνήµης void* malloc(unsigned long size); έχεται ως όρισµα το µέγεθος του τµήµατος που θα καταχωρηθεί στη δυναµική µνήµη Επιστρέφει δείκτη γενικού τυπου (void*) στο τµήµα δυναµικής µνήµης που καταχωρήθηκε void free(void* heapblockpointer); έχεται ως όρισµα δείκτη σε τµήµα µνήµης που θα αποδεσµευτεί κατά την κλήση Το όρισµα πρέπει να είναι ακριβώς ο ίδιος δείκτης που επέστρεψε προηγούµενη κλήση της malloc() εν επιστρέφει τίποτα Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 28

Χρήση υναµικής Μνήµης Καταχώρηση δυναµικής µνήµης για µεταβλητή τύπου int γίνεται µε απαίτηση µεγέθους sizeof(int) Τοπική υναµική void Heap1() { int* intptr; intptr = (int *) malloc(sizeof(int)); *intptr = 42; intptr intptr 42 } free(intptr); intptr Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 29

ιαρροή Μνήµης (memory leak) Όταν ένα πρόγραµµα καταχωρεί δυναµική µνήµη χωρίς να την αποδεσµεύει µετά το πέρας της χρήσης της Μπορεί το πρόγραµµα να εξαντλήσει όλη τη δυναµική µνήµη και να τερµατιστεί πρόωρα char* StringCopy(const char* string) { char* newstring; int len; } len = strlen(string) + 1; /* +1 για το '\0' */ newstring = (char *) malloc(sizeof(char)*len); assert(newstring!= NULL); /* έλεγχος σφάλµατος */ strcpy(newstring, string); return(newstring); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 30

Προγραµµατιστικά Σφάλµατα (1) Βρείτε το σφάλµα στο παρακάτω πρόγραµµα #include <stdio.h> int main( void ) { int i; scanf( "%d", &i ); if( i = 0 ) puts( "false" ); else puts( "true" ); } exit(0); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 31

Προγραµµατιστικά Σφάλµατα (2) Βρείτε το σφάλµα στο παρακάτω πρόγραµµα #include <stdio.h> int main( void ) { int i; } scanf( "%d", i ); printf( "input = %d\n", i ); exit(0); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 32

Προγραµµατιστικά Σφάλµατα (3) Βρείτε το σφάλµα στο παρακάτω πρόγραµµα #include <stdio.h> int main( void ){ int *pc; } scanf( "%d", pc ); printf( "%d\n", pc ); exit(0); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 33

Προγραµµατιστικά Σφάλµατα (4) Βρείτε το σφάλµα στο παρακάτω πρόγραµµα #include <stdlib.h> int main( void ){ double *p; p = malloc (sizeof (double *)); } exit(0); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 34

Προγραµµατιστικά Σφάλµατα (5) Βρείτε το σφάλµα στο παρακάτω πρόγραµµα #include <stdio.h> int main( void ) { char s[] = "hi"; if (s == "hi") puts ("Strings are equal"); else puts ("Strings are not equal"); } exit(0); Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 35

οµή Προγράµµατος Όταν σχεδιάζουµε µεγάλα προγράµµατα συνίσταται να τα διαιρούµε σε τµήµατα (modules) Οµαδοποιούν συσχετιζόµενες συναρτήσεις Αναπτύσσονται παράλληλα από διαφορετικές οµάδες Τροποποιούνται ανεξάρτητα το ένα από το άλλο Επαναχρησιµοποιούνται σε διαφορετικά προγράµµατα Όταν ένα τµήµα αλλάζει, µεταγλωττίζεται ξανά µόνο αυτό Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 36

Εσωτερικές Μεταβλητές Ορίζονται στο εσωτερικό µιας συνάρτησης (τοπικές) Χρησιµοποιούνται µόνο από τη συνάρτηση αυτή Εξωτερικές Ορίζονται εξωτερικά από κάθε συνάρτηση Μπορούν εν δυνάµει να χρησιµοποιηθούν από όλο το πρόγραµµα Παραµένουν ενεργές καθόλη τη διάρκεια εκτέλεσης προγράµµατος Η εµβέλειά τους ξεκινάει στο σηµείο της δήλωσης και τελειώνει στο τέλος του αρχείου της δήλωσης Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 37

Εξωτερικές Μεταβλητές Ορισµός (definition, defining declaration) Γίνεται µόνο µία φορά µέσα σε ένα πρόγραµµα Καθορίζει τον τύπο της µεταβλητής Καταχωρεί µνήµη για την αποθήκευση των δεδοµένων Π.χ. int errorcount = 0; ήλωση (declaration, referencing declaration) Μπορεί να γίνει πολλαπλώς µέσα σε ένα πρόγραµµα Καθορίζει τον τύπο της µεταβλητής Π.χ. extern int errorcount; Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 38

Περιέχουν ηλώσεις µεταβλητών Αρχεία Επικεφαλίδας Πρωτότυπα συναρτήσεων Εντολές του προεπεξεργαστή Εξασφαλίζουν επικοινωνία µεταξύ διαφορετικών τµηµάτων του προγράµµατος εν περιέχουν εκτελέσιµο κώδικα, όπως ορισµούς και αρχικοποιήσεις µεταβλητών ή συναρτήσεις Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 39

Πρόγραµµα Πολλαπλών Αρχείων header.h #define MY_STRING "Hello World" extern char *anotherstring; void writemystring(char *thisstring); main.c #include <stdio.h> #include "header.h" char *anotherstring = "Hello Everyone"; main() { printf("running...\n"); writemystring(my_string); printf("finished.\n"); } #include <stdio.h> #include "header.h" write.c void writemystring(char *thisstring) { printf("%s\n", thisstring); printf("global Variable = %s\n", anotherstring); } Ανοιξη 2005 Στέργιος Β. Αναστασιάδης 40