cs 136 remote learning edition supplemental contentcs136/current/handouts/...stack int g = 5;const...

74
This scholarly work is copyright (c) 2020 Dave Tompkins and is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. CS 136 – Remote Learning Edition Supplemental Content Intro Music: HAPPY by texasradiofish (c) copyright 2020 Licensed under a Creative Commons Noncommercial Sampling Plus license. http://dig.ccmixter.org/files/texasradiofish/62035 Ft: Haskel, Martijn de Boer, Apoxode, Stefan Kartenberg, Subhashish, boboshin The primary content source for CS 136 is the lecture notes (“readings”) This video is designed to supplement and enrich the lecture notes with additional examples and explanations This video was recorded in Fall 2020 – Any errata or discrepancies from the current lecture notes will be identified in an special piazza post

Upload: others

Post on 15-Feb-2021

14 views

Category:

Documents


0 download

TRANSCRIPT

  • This scholarly work is copyright (c) 2020 Dave Tompkins and is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

    CS 136 – Remote Learning EditionSupplemental Content

    Intro Music: HAPPY by texasradiofish (c) copyright 2020 Licensed under a Creative Commons Noncommercial Sampling Plus license.http://dig.ccmixter.org/files/texasradiofish/62035 Ft: Haskel, Martijn de Boer, Apoxode, Stefan Kartenberg, Subhashish, boboshin

    • The primary content source for CS 136 is the lecture notes (“readings”)

    • This video is designed to supplement and enrich the lecture notes with additional examples and explanations

    • This video was recorded in Fall 2020 – Any errata or discrepancies from the current lecture notes will be identified in an special piazza post

  • CS 136 Lecture NotesSupplemental Examples

    Memory Snapshots and Control Flow

  • Control FlowExample 1

    The Call Stack

  • void blue(void) {printf("three\n");return;

    }

    void green(void) {blue();printf("four\n");return;

    }

    void red(void) {printf("two\n");green();printf("five\n");return;

    }

    int main(void) {printf("one\n");red();printf("six\n");

    }

    main main

    red

    green

    main

    red

    green

    blue

    main

    red

    green

    main

    red

    mainmain

    printf

    mainmain

    red

    call stack over time

  • Memory SnapshotsExample 2

    Read-Only, Global Data and the Stack

  • int g = 5;const int r = 13;

    int foo(int a) {// SNAPSHOT 2int b = 2;const int c = 3;// SNAPSHOT 3return a * b * c;

    }

    int main(void) {// SNAPSHOT 1int z = 1;int y = foo(z);// SNAPSHOT 4

    }

    READ-ONLYr: 13

    GLOBAL DATAg: 5

    mainz: ???y: ???r/a: OS

    STACK

  • STACK

    int g = 5;const int r = 13;

    int foo(int a) {// SNAPSHOT 2int b = 2;const int c = 3;// SNAPSHOT 3return a * b * c;

    }

    int main(void) {// SNAPSHOT 1int z = 1;int y = foo(z);// SNAPSHOT 4

    }

    READ-ONLYr: 13

    GLOBAL DATAg: 5

    mainz: 1y: ???r/a: OS

    fooa: 1b: ???c: ???r/a: main ●

  • STACK

    int g = 5;const int r = 13;

    int foo(int a) {// SNAPSHOT 2int b = 2;const int c = 3;// SNAPSHOT 3return a * b * c;

    }

    int main(void) {// SNAPSHOT 1int z = 1;int y = foo(z);// SNAPSHOT 4

    }

    READ-ONLYr: 13

    GLOBAL DATAg: 5

    mainz: 1y: ???r/a: OS

    fooa: 1b: 2c: 3r/a: main ●

  • STACK

    int g = 5;const int r = 13;

    int foo(int a) {// SNAPSHOT 2int b = 2;const int c = 3;// SNAPSHOT 3return a * b * c;

    }

    int main(void) {// SNAPSHOT 1int z = 1;int y = foo(z);// SNAPSHOT 4

    }

    READ-ONLYr: 13

    GLOBAL DATAg: 5

    mainz: 1y: 6r/a: O/S

  • Memory SnapshotsExample 3

    Multiple Returns and Block Variables

  • void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

    READ-ONLY GLOBAL DATA

    mainz: ???y: ???r/a: OS

    STACK

  • READ-ONLY GLOBAL DATA

    mainz: ???y: ???r/a: OS

    STACK

    say_hellor/a: main ●

    void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

  • READ-ONLY GLOBAL DATA

    mainz: ???y: ???r/a: OS

    STACK

    void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

  • READ-ONLY GLOBAL DATA

    mainz: ???y: ???r/a: OS

    STACK

    fooa: -4b: 2c: 16d: ???

    r/a: main ●

    void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

  • STACK

    READ-ONLY GLOBAL DATA

    mainz: -128y: ???r/a: OS

    void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

  • void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

    STACK

    READ-ONLY GLOBAL DATA

    mainz: -128y: ???r/a: OS

    fooa: 3b: 2c: ???d: -3

    r/a: main ●

  • void say_hello(void) {printf("hello\n");// SNAPSHOT 2

    }

    int foo(int a) {int b = 2;if (a < 0) {

    int c = a * a;// SNAPSHOT 4return a * b * c;

    } else if (a > 0) {int d = a * -1;// SNAPSHOT 6return a * b * d;

    }return 0;

    }

    int main(void) {// SNAPSHOT 1say_hello();// SNAPSHOT 3int z = foo(-4);// SNAPSHOT 5int y = foo(3);// SNAPSHOT 7

    }

    STACK

    READ-ONLY GLOBAL DATA

    mainz: -128y: -18r/a: OS

  • Memory SnapshotsExample 4Shadowing (Avoid This)

  • STACK

    int n = 1;

    int main(void) {printf("%d\n", n); // 1int n = 2;printf("%d\n", n); // 2{int n = 3;printf("%d\n", n); // 3

    }printf("%d\n", n); // 2// SNAPSHOT

    }

    READ-ONLY GLOBAL DATAn: 1

    mainn0: 2n1: 3r/a: OS

  • STACK

    int n = 1;

    int main(void) {printf("%d\n", n); // 1int n0 = 2;printf("%d\n", n0); // 2{int n1 = 3;printf("%d\n", n1); // 3

    }printf("%d\n", n0); // 2// SNAPSHOT

    }

    READ-ONLY GLOBAL DATAn: 1

    mainn0: 2n1: 3r/a: OS

  • Memory SnapshotsExample 5

    Mutation & Loops

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 5

    mainz: 1r/a: OS

    fooa: 1b: 2i: ???r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 5

    mainz: 1r/a: OS

    fooa: 1b: 3i: ???r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 1b: 3i: ???r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 2b: 3i: ???r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 2b: 3i: 2r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 2b: 3i: 1r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 2b: 3i: 0r/a: main ●

  • STACK

    int g = 5;

    void foo(int a) {int b = 2;// SNAPSHOT 1b += a;// SNAPSHOT 2g += 2;// SHAPSHOT 3a++;// SNAPSHOT 4int i = 2;while (i >= 0) {// SNAPSHOT 5, 6, 7printf("%d\n", i);--i;

    }// SNAPSHOT 8

    }

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATAg: 7

    mainz: 1r/a: OS

    fooa: 2b: 3i: -1r/a: main ●

  • Memory SnapshotsExample 6

    Uninitialized Variables (yuck)and Variable Definition inside of a Loop

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: 5i: ???k: ???r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: ???k: ???r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 2k: ???r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 2k: 0r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 2k: 1r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 1k: 1r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 2k: 0r/a: main ●

  • STACK

    void foo(int a) {int b;int c = 5;// SNAPSHOT 1c += b;// SNAPSHOT 2int i = 2;while (i >= 0) {// SNAPSHOT 3, 6int k = 0;// SNAPSHOT 4, 7++k;// SNAPSHOT 5, 8printf("%d\n", i);i -= k;

    }}

    int main(void) {int z = 1;foo(z);

    }

    READ-ONLY GLOBAL DATA

    mainz: 1r/a: OS

    fooa: 1b: ???c: ???i: 2k: 1r/a: main ●

  • Memory SnapshotsExample 7

    Recursion, Recursion, Recursion ...

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 0r/a: main ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 0r/a: main ●

    sum_firstn: 1sum: 0r/a: sum_first ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 0r/a: main ●

    sum_firstn: 1sum: 0r/a: sum_first ●

    sum_firstn: 0sum: 0r/a: sum_first ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 0r/a: main ●

    sum_firstn: 1sum: 0r/a: sum_first ●

    sum_firstn: 0sum: 0r/a: sum_first ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 0r/a: main ●

    sum_firstn: 1sum: 1r/a: sum_first ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: ???r/a: OS

    sum_firstn: 2sum: 3r/a: main ●

  • STACKint sum_first(int n) {int sum = 0;// SNAPSHOT 2, 3, 4if (n > 0) {sum = n + sum_first(n - 1);

    }// SNAPSHOT 5, 6, 7return sum;

    }

    int main(void) {// SNAPSHOT 1int a = sum_first(2);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATA

    maina: 3r/a: OS

  • Memory SnapshotsExample 8Introduction to Pointers

  • STACK

    int main(void) {int i = 5;int j = 6;int k = 7;// SNAPSHOT 1int *p = &i;int *q = &j;// SNAPSHOT 2int *r = NULL;// SNAPSHOT 3int *s = p;// SNAPSHOT 4int **d = &p;// SNAPSHOT 5

    }

    READ-ONLY GLOBAL DATA

    maini: 5j: 6k: 7p: ???q: ???r: ???s: ???d: ???r/a: OS

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: ???s: ???d: ???r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;// SNAPSHOT 1int *p = &i;int *q = &j;// SNAPSHOT 2int *r = NULL;// SNAPSHOT 3int *s = p;// SNAPSHOT 4int **d = &p;// SNAPSHOT 5

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: NULLs: ???d: ???r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;// SNAPSHOT 1int *p = &i;int *q = &j;// SNAPSHOT 2int *r = NULL;// SNAPSHOT 3int *s = p;// SNAPSHOT 4int **d = &p;// SNAPSHOT 5

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: NULLs: ●d: ???r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;// SNAPSHOT 1int *p = &i;int *q = &j;// SNAPSHOT 2int *r = NULL;// SNAPSHOT 3int *s = p;// SNAPSHOT 4int **d = &p;// SNAPSHOT 5

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: NULLs: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;// SNAPSHOT 1int *p = &i;int *q = &j;// SNAPSHOT 2int *r = NULL;// SNAPSHOT 3int *s = p;// SNAPSHOT 4int **d = &p;// SNAPSHOT 5

    }

    READ-ONLY GLOBAL DATA

  • Memory SnapshotsExample 9

    Pointers with Mutation

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: NULLs: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: NULLs: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: ●s: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: ●s: NULLd: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 7p: ●q: ●r: ●s: NULLd: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 10p: ●q: ●r: ●s: NULLd: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 6p: ●q: ●r: ●s: NULLd: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 6p: ●q: ●r: ●s: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 6p: ●q: ●r: ●s: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • STACK

    maini: 5j: 6k: 1p: ●q: ●r: ●s: ●d: ●r/a: OS

    int main(void) {int i = 5;int j = 6;int k = 7;int *p = &i;int *q = &j;int *r = NULL;int *s = p;int **d = &p;// SNAPSHOT 1p = &k;// SNAPSHOT 2r = q;// SNAPSHOT 3s = NULL;// SNAPSHOT 4d = &s;// SNAPSHOT 5*p = 10;// SNAPSHOT 6*p = *q;// SNAPSHOT 7*d = &i;// SNAPSHOT 8*d = p;// SNAPSHOT 9**d = 1;// SNAPSHOT 10

    }

    READ-ONLY GLOBAL DATA

  • Memory SnapshotsExample 10

    Pointer Parameters and Structures

  • mainz: 1p:r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 5

    3 7

  • mainz: 1p: .x: 3 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 5

  • mainz: 2p: .x: 3 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 5

    add1a: ●

    r/a: main ●

  • mainz: 2p: .x: 3 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6

    add1a: ●

    r/a: main ●

  • mainz: 2p: .x: 4 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6

    add1a: ●

    r/a: main ●

  • mainz: 2p: .x: 4 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6

    posn_add1s: ●

    r/a: main ●

  • mainz: 2p: .x: 5 .y: 7r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6

    posn_add1s: ●

    r/a: main ●

  • mainz: 2p: .x: 5 .y: 8r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6

    posn_add1s: ●

    r/a: main ●

    add1a: ●

    r/a: posn_add1 ●

  • mainz: 2p: .x: 5 .y: 8r/a: OS

    struct posn {int x;int y;

    };

    int g = 5;

    void add1(int *a) {*a += 1;// SNAPSHOT 2, 3, 4, 7

    }

    void posn_add1(struct posn *s) {// SNAPSHOT 5s->x += 1;// SNAPSHOT 6add1(&s->y);

    }

    int main(void) {int z = 1;struct posn p = {3, 7};// SNAPSHOT 1add1(&z);add1(&g);add1(&p.x);posn_add1(&p);// SNAPSHOT 8

    }

    READ-ONLY GLOBAL DATAg: 6