Πξνγξακκαηηζκόο Ι (ΗΥ120) Γηάιεμε 9: Σπλαξηήζεηο
Οξηζκόο ζπλαξηήζεωλ <ηύπορ> <όνομα> (<ηςπικέρ παπάμεηποι>) { /* δήλωζη μεηαβληηών */ /* ενηολέρ ελέγσος/επεξεπγαζίαρ */ 2 o Μηα ζπλάξηεζε νξίδεηαη δίλνληαο (α) ηνλ ηύπν ηνπ απνηειέζκαηνο πνπ επηζηξέθεη (void αλ δελ επηζηξέθεη ηηκή), (β) ην όλνκα ηεο, (γ) ηελ ιίζηα κε ηηο «ηππηθέο» παξακέηξνπο ηεο, θαη (δ) ην ζώκα ηεο. o Τα (α), (β), (γ) απνηεινύλ ηελ επηθεθαιίδα θαη ην (δ) ηνλ θώδηθα / ζώκα (body) ηεο ζπλάξηεζεο. o Μηα ζπλάξηεζε κπνξεί λα δειωζεί (μερωξηζηά) κέζω ηεο επηθεθαιίδαο ηεο, κε ηελ πινπνίεζε ηεο λα δίλεηαη ζε παξαθάηω ζεκείν ηνπ θώδηθα (ή αθόκα θαη ζε δηαθνξεηηθό αξρείν).
Επηζηξνθή απνηειέζκαηνο o Η επηζηξνθή απνηειέζκαηνο κηαο ζπλάξηεζεο γίλεηαη κε ηελ εληνιή return(<ηιμή>) o Αλ απηή δελ ππάξρεη ή ρξεζηκνπνηεζεί ρωξίο θάπνηα ηηκή, ηόηε ε ζπλάξηεζε επηζηξέθεη κηα ηπραία ηηκή. o Καη ν κεηαγιωηηηζηήο εκθαλίδεη κηα πξνεηδνπνίεζε. o Όηαλ εθηειεζζεί ε εληνιή return ηεξκαηίδεηαη απηόκαηα θαη ε εθηέιεζε ηεο ζπλάξηεζεο. o Η εληνιή return κπνξεί λα ππάξρεη ζε πνιιά ζεκεία ηνπ ζώκαηνο ηεο ζπλάξηεζεο o Φξεηάδεηαη πξνζνρή έηζη ώζηε λα επηζηέθεηαη ην επηζπκεηό απνηέιεζκα ζε θάζε πεξίπηωζε. o Η θπξίωο ζπλάξηεζε main επηζηξέθεη ηελ ηηκή ηεο ζην πεξηβάιινλ εθηέιεζεο (ιεηηνπξγηθό ζύζηεκα). 3
Κιήζε ζπλάξηεζεο o Η θιήζε κηαο ζπλάξηεζεο πξαγκαηνπνηείηαη δίλνληαο ην όλνκα ηεο ζπλάξηεζεο, θαη ζε παξελζέζεηο κηα ηηκή γηα θάζε κηα από ηηο ηππηθέο παξακέηξνπο ηεο, ρξεζηκνπνηώληαο ην, ωο δηαρωξηζηηθό. o Αλ κηα ζπλάξηεζε επηζηξέθεη απνηέιεζκα, ηόηε ε θιήζε ηεο ζπλάξηεζεο απνηειεί έθθξαζε απνηίκεζεο πνπ δίλεη ηηκή ηνπ αληίζηνηρνπ ηύπνπ. o Μηα θιήζε ζπλάξηεζεο κπνξεί λα ρξεζηκνπνηεζεί γηα ηελ αλάζεζε ηηκήο ζε κεηαβιεηή o ή/θαη ζαλ ηκήκα έθθξαζεο ζε ζπλδπαζκό κε θαηάιιειν ηειεζηή o πνπ κπνξεί λα ρξεζηκνπνηεζεί γηα ηηκέο ηνπ ηύπνπ πνπ επηζηξέθεη ε ζπλάξηεζε. 4
/* σπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); 5 int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 ints: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0);
/* σπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> 6 int max2(int x, int y) { if (x > y) { return(x); return(y); int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); return(0);
/* σπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { int z; 7 if (x > y) { z = x; else { z = y; return(z); int main(int argc, char *argv[]) { int in1,in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max);
Παξάκεηξνη ζπλάξηεζεο 8 o Οη παξάκεηξνη πνπ νξίδνληαη θαηά ηελ πινπνίεζε κηαο ζπλάξηεζεο νλνκάδνληαη ηππηθέο παξάκεηξνη. o Τα νλόκαηα ηνπο είλαη ζπκβνιηθά, έηζη ώζηε ν θώδηθαο ηεο ζπλάξηεζεο λα κπνξεί λα επεμεξγαζηεί ηηο ηηκέο πνπ πεξληνύληαη ζηελ θιήζε, θαη ν ηύπνο ηνπο απιά πξνζδηνξίδεη ηνλ ηύπν ηωλ ηηκώλ πνπ πξέπεη λα δνζνύλ ζαλ παξάκεηξνη θαηά ηελ θιήζε. o Οη ηηκέο πνπ δίλνληαη όηαλ θαιείηαη κηα ζπλάξηεζε, γηα θάζε κηα από ηηο ηππηθέο παξακέηξνπο ηεο νλνκάδνηαη πξαγκαηηθέο παξάκεηξνη. o Γηα θάζε θιήζε, ε ίδηα ζπλάξηεζε κπνξεί λα δέρεηαη δηαθνξεηηθέο πξαγκαηηθέο παξακέηξνπο γηα ηηο ίδηεο ηππηθέο παξακέηξνπο.
Πέξαζκα παξακέηξωλ θαζ απνηίκεζε o Γηα θάζε ηππηθή παξάκεηξν ηύπνπ Τ κηαο ζπλάξηεζεο κπνξεί θαηά ηελ θιήζε λα δνζεί ζαλ πξαγκαηηθή παξάκεηξνο κηα νπνηαδήπνηε ηηκή ηύπνπ Τ. o Αλ ζαλ παξάκεηξνο θιήζεο, αληί γηα ζπγθεθξηκέλε ηηκή, δνζεί κηα έθθξαζε, ηόηε απηή ζα απνηηκεζεί θαη ζαλ πξαγκαηηθή παξάκεηξνο ηεο θιήζεο ζα πεξαζηεί ην απνηέιεζκα ηεο έθθξαζεο. o Πηζαλέο παξάκεηξνη θιήζεο γηα ηππηθή παξάκεηξν Τ: o θπξηνιεθηηθό ηύπνπ Τ o κεηαβιεηή ηύπνπ Τ o έθθξαζε πνπ απνηηκάηαη ζε ηηκή Τ 9 o Σαλ παξάκεηξνο θιήζεο κηαο ζπλάξηεζεο κπνξεί λα δνζεί κηα θιήζε ζπλάξηεζεο ηύπνπ Τ.
/* σπολογισμός μέγιστης τιμής 2 ακεραίων */ #include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); τσπικές παράμετροι, τα ονόματα των οποίων τρησιμοποιούνται για να γίνεται αναυορά στις τιμές ποσ θα περαστούν όταν κληθεί η σσγκεκριμένη σσνάρτηση επιστρευόμενη τιμή 10 int main(int argc, char *argv[]) { int in1, in2, max; printf("enter 2 int: "); scanf("%d %d", &in1, &in2); max = max2(in1, in2); printf( max = %d\n", max); πραγματικές παράμετροι, ποσ είναι οι τιμές ποσ περνιούνται στην κλήση σσνάρτησης αποθήκεσση τιμής ποσ επιστρέυεται για τις τιμές ποσ περάστηκαν ως παράμετροι
#include <stdio.h> int max2(int x, int y) { if (x > y) { return(x); else { return(y); 11 int main(int argc, char* argv[]) { int in1, in2, in3; printf("enter 3 int: "); scanf("%d %d %d", &in1, &in2, &in3); printf("%d\n", max2(in1, in2)); printf("%d\n", max2(in1 + in2, 25); printf("%d\n", max2(in1, max2(in2, in3)) );
Παξάκεηξνη θαη ηνπηθέο κεηαβιεηέο o Κάζε ζπλάξηεζε κπνξεί λα δειώλεη λέεο δηθέο ηεο (ηνπηθέο) κεηαβιεηέο πνπ ρξεζηκνπνηεί γηα ηνπο δηθνύο ηεο ζθνπνύο (επηζπκεηή επεμεξγαζία). o Οη ηππηθέο παξάκεηξνη αληηζηνηρνύλ ζε εηδηθέο ηνπηθέο κεηαβιεηέο πνπ ρξεζηκνπνηνύληαη γηα ηελ απνζήθεπζε (θαη πξόζβαζε) ηωλ πξαγκαηηθώλ παξακέηξωλ θαηά ηελ θιήζε ηεο ζπλάξηεζεο. o Σηηο αξρηθέο εθδόζεηο ηεο γιώζζαο C, ε δήιωζε ηωλ ηππηθώλ παξακέηξωλ κηαο ζπλάξηεζεο γηλόηαλ (ζρεδόλ) όπωο γηα ηηο ηνπηθέο κεηαβιεηέο. o Οη ηππηθέο παξάκεηξνη δελ κπνξεί λα έρνπλ ην ίδην όλνκα κε ηνπηθέο κεηαβιεηέο νύηε ην αληίζηξνθν (δηαθνξεηηθά δελ ζα ππήξρε ηξόπνο δηαρωξηζκνύ αλάκεζα ζηελ ηππηθή παξάκεηξν θαη ηελ ηνπηθή κεηαβιεηή κε ην ίδην όλνκα κέζα από ηνλ θώδηθα ηεο ζπλάξηεζεο). 12
Εκβέιεηα κεηαβιεηώλ o Οη ηνπηθέο κεηαβιεηέο (θαη ηππηθέο παξάκεηξνη) νξίδνληαη ζηα πιαίζηα κηαο ζπλάξηεζεο θαη είλαη πξνζπειάζηκεο (νξαηέο) κόλν από ηνλ θώδηθα ηεο. o Οη θαζνιηθέο κεηαβιεηέο νξίδνληαη ζηελ αξρή ηνπ θεηκέλνπ ηνπ πξνγξάκκαηνο έμω από ηηο ζπλαξηήζεηο (θαη έμω από ηελ main) θαη είλαη πξνζπειάζηκεο (νξαηέο) κέζα από θάζε ζπλάξηεζε. o Αλ κηα ηνπηθή κεηαβιεηή (ή ηππηθή παξάκεηξνο) κηαο ζπλάξηεζεο έρεη ην ίδην όλνκα κε κηα θαζνιηθή κεηαβιεηή, ηόηε; o Απνθξύπηεη ηελ θαζνιηθή κεηαβιεηή θαη ηελ θαζηζηά κε πξνζπειάζηκε γηα ηνλ θώδηθα ηεο ζπλάξηεζεο. 13
int a, b, c; 14 void f(int b) { int a, d;...... int main(int argc, char *argv[]) { int c;......
#include <stdio.h> int a = 0, b = 0, c = 0; void f(int b) { int a, d; a = b--; c = a*b; d = c-1; printf("f: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); 15 int main(int argc, char *argv[]) { int c = 1, d = 1; c = a + b; b = b + 1; printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); f(c); printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); c = a + b; b = b + 1; f(a); printf("main: a=%d, b=%d, c=%d, d=%d\n", a, b, c, d);
Σπλαξηήζεηο θαη θαζνιηθέο κεηαβιεηέο o Η αιιαγή κηαο θαζνιηθήο κεηαβιεηήο κέζα από κηα ζπλάξηεζε ζπληζηά κηα (θιαζηθή) παξελέξγεηα. o Απηή ε αιιαγή δελ κπνξεί λα εληνπηζηεί ρωξίο λα δηαβάζνπκε ηνλ θώδηθα ηεο ζπλάξηεζεο. o Φπζηθά νη θαζνιηθέο κεηαβιεηέο ππάξρνπλ αθξηβώο γηα απηό ην ιόγν, δειαδή γηα λα επηηξέπνπλ ηελ επηθνηλωλία αλάκεζα ζε δηαθνξεηηθέο ζπλαξηήζεηο. o Απηή ε ιύζε πξέπεη λα επηιέγεηαη κε ζύλεζε (θαη λα ηεθκεξηώλεηαη θαηάιιεια, π.ρ. ζύληνκν ζρόιην) o όηαλ ην επηζπκεηό απνηέιεζκα δελ κπνξεί λα επηηεπρζεί (κε απιό ηξόπν) κε πέξαζκα θαηάιιειωλ παξακέηξωλ θαη επηζηξνθή απνηειεζκάηωλ. 16
προγραμματισμός με παρενέργειες void f() { θαζνιηθέο κεηαβιεηέο 17 προγραμματισμός τωρίς παρενέργειες int f() { τοπικές μεταβλητές return(); 17
Δηάξθεηα δωήο κεηαβιεηώλ 18 o Οη θαζνιηθέο κεηαβιεηέο είλαη κόληκεο, δειαδή πθίζηαληαη θαη θξαηάλε ηηο ηηκέο ηνπο θαζ όιε ηελ δηάξθεηα ηεο εθηέιεζεο ηνπ πξνγξάκκαηνο. o Οη ηνπηθέο κεηαβιεηέο είλαη πξνζωξηλέο, δειαδή πθίζηαληαη θαη θξαηάλε ηηο ηηκέο ηνπο κόλν όζν θξαηά ε εθάζηνηε εθηέιεζε ηεο ζπλάξηεζεο. o Εμαίξεζε: ηνπηθέο κεηαβιεηέο κε ηνλ πξνζδηνξηζκό static είλαη κόληκεο, δειαδή θξαηνύλ ηελ ηηκή ηνπο αλάκεζα ζηηο εθηειέζεηο ηεο ζπλάξηεζεο. o Οη static ηνπηθέο κεηαβιεηέο πξέπεη πάληα λα αξρηθνπνηνύληαη o Η εληνιή αξρηθνπνίεζεο εθηειείηαη κηα θνξά όηαλ ε ζπλάξηεζε θιεζεί γηα πξώηε θνξά.
#include <stdio.h> void f() { 19 static int a = 0; a++; printf("f: a=%d\n", a); int main(int argc, char *argv[]) { f(); f(); f();
Eθηέιεζε ζπλάξηεζεο Όηαλ κηα ζπλάξηεζε Α θαιεί κηα άιιε ζπλάξηεζε Β, ε εθηέιεζε ηνπ θώδηθα ηεο «θαινύζαο» ζπλάξηεζεο ζηακαηά κέρξη λα νινθιεξωζεί ε εθηέιεζε ηνπ θώδηθα ηεο «θιεζείζαο» ζπλάξηεζεο: 1. Η εθηέιεζε ηεο ζπλάξηεζεο Α ζηακαηά ζην ζεκείν όπνπ γίλεηαη ε θιήζε ηεο ζπλάξηεζεο Β. 2. Αξρηθνπνηνύληαη νη παξάκεηξνη θαη ηνπηθέο κεηαβιεηέο ηεο ζπλάξηεζεο Β. 3. Αξρίδεη ε εθηέιεζε ηνπ θώδηθα ηεο ζπλάξηεζεο Β (πνπ κπνξεί λα θαιέζεη θαη άιιεο ζπλαξηήζεηο). 4. Όηαλ ηεξκαηίδεηαη ε εθηέιεζε ηεο ζπλάξηεζεο Β, ε εθηέιεζε ζπλερίδεηαη ζηελ ζπλάξηεζε Α κε ηελ ακέζωο επόκελε εληνιή, κεηά ηελ θιήζε ηεο Β. 20
Πιαίζην εθηέιεζεο ζπλάξηεζεο Ο ίδηνο θώδηθαο ηεο ζπλάξηεζεο εθηειείηαη θάζε θνξά ζε έλα δηαθνξεηηθό πιαίζην εθηέιεζεο (ζε έλαλ μερωξηζηό «κηθξόθνζκν»). Τν πιαίζην εθηέιεζεο δεκηνπξγείηαη (εθ λένπ) πξηλ αξρίζεη ε εθηέιεζε ηνπ θώδηθα ηεο ζπλάξηεζεο θαη θαηαζηξέθεηαη όηαλ νινθιεξωζεί ε εθηέιεζε ηεο. Γηα θάζε θιήζε, δεκηνπξγείηαη έλα θαηλνύξγην θαη μερωξηζηό πιαίζην εθηέιεζεο, πνπ δελ έρεη ζρέζε κε πξνεγνύκελα πιαίζηα εθηέιεζεο. 21 Τν πιαίζην εθηέιεζεο ρξεζηκεύεη γηα ηελ απνζήθεπζε ηωλ ηνπηθώλ κεηαβιεηώλ θαη ηωλ πξαγκαηηθώλ παξακέηξωλ γηα ηελ ζπγθεθξηκέλε θιήζε.
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main 22
void f1() { <A> void foo2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D 23
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 24
void f1() { <A> void foo2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B 25
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 26
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A 27
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστρουή 28
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστρουή εκτέλεση C 29
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστρουή εκτέλεση C επιστρουή 30
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστρουή εκτέλεση C επιστρουή εκτέλεση Ε 31
void f1() { <A> void f2() { <B> f1(); <C> int main(){ <D> f2(); <E> κλήση main εκτέλεση D κλήση f2 εκτέλεση B κλήση f1 εκτέλεση A επιστρουή εκτέλεση C επιστρουή εκτέλεση Ε επιστρουή 32
Δέζκεπζε κλήκεο κεηαβιεηώλ Η κλήκε ηωλ κόληκωλ (θαζνιηθώλ θαη ηνπηθώλ) κεηαβιεηώλ είλαη ζηαηηθή, θαη δεζκεύεηαη γηα όιε ηελ δηάξθεηα ηεο εθηέιεζεο ηνπ πξνγξάκκαηνο. Η κλήκε ηωλ πξνζωξηλώλ (ηνπηθώλ) κεηαβιεηώλ κηαο ζπλάξηεζεο είλαη δπλακηθή Δεζκεύεηαη / απνδεζκεύεηαη καδί κε ην αληίζηνηρν πιαίζην εθηέιεζεο. Η δηαρείξηζε ηεο ηνπηθήο κλήκεο ηωλ ζπλαξηήζεωλ γίλεηαη κέζω ηνπ κεραληζκνύ ηεο ζηνίβαο. Υπνζηεξίδεηαη ε ελαιιάμ ή/θαη αιπζηδωηή εθηέιεζε ζπλαξηήζεωλ κε ηνπο ιηγόηεξνπο δπλαηνύο πόξνπο θαη ηελ κεγαιύηεξε δπλαηή ηαρύηεηα εθηέιεζεο. 33
Σηνίβα Γεζκεύεηαη έλα (κεγάιν) ζπλερόκελν ηκήκα κλήκεο, πνπ ρξεζηκνπνηείηαη ζύκθωλα κε ηελ ινγηθή ηεο ζηνίβαο (Last In First Out - LIFO queue) γηα ηελ απνζήθεπζε ηωλ ηηκώλ ηωλ παξακέηξωλ θαη ηνπηθώλ κεηαβιεηώλ ηωλ ζπλαξηήζεωλ. Kαη ηωλ θαηαρωξεηώλ ηεο CPU κεηαμύ θιήζεωλ δηαθνξεηηθώλ ζπλαξηήζεωλ Τν όξην ηεο κλήκεο ηεο ζηνίβαο πνπ ρξεζηκνπνηείηαη αλά πάζα ζηηγκή ππνδεηθλύεηαη από έλα εηδηθό δείθηε (πνπ δηαρεηξίδεηαη ην πεξηβάιινλ εθηέιεζεο) πνπ νλνκάδεηαη stack pointer. Κάζε θνξά πνπ γίλεηαη κηα λέα θιήζε θαη θάζε θνξά πνπ ηεξκαηίδεηαη κηα θιήζε, ε ηηκή ηνπ stack pointer αιιάδεη ώζηε λα δείρλεη ζην ηξέρωλ πιαίζην εθηέιεζεο. 34
int v1; κλήση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); στατική μνήμη v1 στοίβα 35 int main(){ int v6; f2(); SP v6 πλαίσιο main
int v1; εκτέλεση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); στατική μνήμη v1 στοίβα 36 int main(){ int v6; f2(); SP v6 πλαίσιο main
int v1; κλήση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v5 v4 v6 πλαίσιο f2 πλαίσιο main 37
int v1; εκτέλεση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v5 v4 v6 πλαίσιο f2 πλαίσιο main 38
int v1; κλήση f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο f1 πλαίσιο f2 πλαίσιο main 39
int v1; εκτέλεση f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο f1 πλαίσιο f2 πλαίσιο main 40
int v1; επιστρουή f1 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο f2 πλαίσιο main 41
int v1; εκτέλεση f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο f2 πλαίσιο main 42
int v1; επιστρουή f2 void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο main 43
int v1; εκτέλεση main void f1(int v2) { int v3; void f2(int v4) { int v5; f1(); int main(){ int v6; f2(); στατική μνήμη v1 SP στοίβα v3 v2 v5 v4 v6 πλαίσιο main 44
Υπεξρείιηζε ζηνίβαο Tν κέγεζνο ηεο ζηνίβαο ελόο πξνγξάκκαηνο είλαη (ζπλήζωο) πεξηνξηζκέλν Γηαηί; Υπάξρεη πεξίπηωζε έλα πξόγξακκα λα εμαληιήζεη ηελ κλήκε ηεο ζηνίβαο ηνπ, κε απνηέιεζκα απηή λα ππεξρεηιίζεη (stack overflow): 1. Γίλνληαη πνιιέο αιπζηδωηέο θιήζεηο ζπλάξηεζεο. 2. Τν κέγεζνο ηωλ ηνπηθώλ κεηαβιεηώλ κηαο ζπλάξηεζεο είλαη κεγάιν, θαη δελ ρωξά ζηελ ζηνίβα. Τόηε ην πξόγξακκα ηεξκαηίδεηαη κε κήλπκα ιάζνπο Παξόκνην κε απηό ζηελ πεξίπηωζε ηεο πξόζβαζεο ζε κε επηηξεπηή ζέζε κλήκε, π.ρ. κέζω δείθηε. 45