lecture5 - cs50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include void foo(char *bar) {...

77

Upload: others

Post on 28-Sep-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 2: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 3: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 4: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{stringname;stringdorm;}student;

Page 5: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 6: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 7: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

environment variables

stack

uninitialized data

heap

Page 8: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

environment variables

stack

uninitialized data

initialized data

text

heap

Page 9: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

voidswap(inta,intb){inttmp=a;a=b;b=tmp;}

Page 10: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

voidswap(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}

Page 11: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

malloc

free

Page 12: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

malloc,calloc,realloc

free

Page 13: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 14: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

intmain(void){int*x;int*y;x=malloc(sizeof(int));*x=42;*y=13;y=x;*y=13;}

Page 15: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 16: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 17: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 18: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 19: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 20: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 21: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 22: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

stack overflow

heap overflow

Page 23: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

buffer overflow

Page 24: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 25: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 26: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 27: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 28: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 29: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

#include<string.h>voidfoo(char*bar){charc[12];memcpy(c,bar,strlen(bar));}intmain(intargc,char*argv[]){foo(argv[1]);}

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 30: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 31: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 32: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 33: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

adapted from wikipedia.org/wiki/Stack_buffer_overflow

Page 34: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

valgrind

Page 35: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

255216255

Page 36: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

0xff0xd80xff

Page 37: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

http://xkcd.com/138/

Page 38: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

debug50

Page 39: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

ddb50

Page 40: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 41: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 42: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

environment variables

stack

uninitialized data

heap

Page 43: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 44: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

https://cs.calvin.edu/activities/books/c++/ds/1e/

Page 45: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

http://cs.calvin.edu/books/c++/ds/1e/

Page 46: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{stringname;stringdorm;}student;

Page 47: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstructnode{intn;structnode*next;}node;

Page 48: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

https://cs.calvin.edu/activities/books/c++/ds/1e/

Page 49: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 50: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

push

pop

...

Page 51: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{intnumbers[CAPACITY];intsize;}stack;

Page 52: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{int*numbers;intsize;}stack;

Page 53: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 54: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

enqueue

dequeue

...

Page 55: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{intfront;intnumbers[CAPACITY];intsize;}queue;

Page 56: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstruct{intfront;int*numbers;intsize;}queue;

Page 57: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 58: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

Figure by Larry Nyhoff.

tree

Page 59: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

22 33 44 55 66 77 88

Page 60: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

22 33 44 55 66 77 88

Page 61: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

Figure from http://cs.calvin.edu/books/c++/ds/1e/.

binary search tree

Page 62: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstructnode{intn;structnode*left;structnode*right;}node;

Page 63: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

boolsearch(intn,node*tree){if(tree==NULL){returnfalse;}elseif(n<tree->n){returnsearch(n,tree->left);}elseif(n>tree->n){returnsearch(n,tree->right);}else{returntrue;}}

Page 64: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

boolsearch(intn,node*tree){if(tree==NULL){returnfalse;}elseif(n<tree->n){returnsearch(n,tree->left);}elseif(n>tree->n){returnsearch(n,tree->right);}else{returntrue;}}

Page 65: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

boolsearch(intn,node*tree){if(tree==NULL){returnfalse;}elseif(n<tree->n){returnsearch(n,tree->left);}elseif(n>tree->n){returnsearch(n,tree->right);}else{returntrue;}}

Page 66: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

boolsearch(intn,node*tree){if(tree==NULL){returnfalse;}elseif(n<tree->n){returnsearch(n,tree->left);}elseif(n>tree->n){returnsearch(n,tree->right);}else{returntrue;}}

Page 67: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

boolsearch(intn,node*tree){if(tree==NULL){returnfalse;}elseif(n<tree->n){returnsearch(n,tree->left);}elseif(n>tree->n){returnsearch(n,tree->right);}else{returntrue;}}

Page 68: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

O(n2) O(n log n) O(n) O(log n) O(1) …

Page 69: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

O(n2) O(n log n) O(n) O(log n) O(1) …

Page 70: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

O(n2) O(n log n) O(n) O(log n) O(1) …

Page 71: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

wikipedia.org

Page 72: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 73: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 74: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

Figure from Lewis and Denenberg’s Data Structures & Their Algorithms.

Page 75: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char

typedefstructnode{boolword;structnode*children[27];}node;

Page 76: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char
Page 77: lecture5 - CS50cdn.cs50.net/2017/fall/lectures/5/lecture5.pdf · #include  void foo(char *bar) { char c[12]; memcpy(c, bar, strlen(bar)); } int main(int argc, char