inst.eecs.berkeley.edu/~cs61c CS61C : Machine Structures Lecture 5 – Introduction to C (pt 3) C Memory Management 2007-01-26 There is one handout today at the front and back of the room! Lecturer SOE Dan Garcia www.cs.berkeley.edu/~ddgarcia Norway: iTunes illegal! Norway ruled that iTunes was illegal because it did not allow downloaded songs encoded with their proprietary Fairplay system to be played on non-iPods. They are asking Apple to open their system up by Oct 1. www.msnbc.msn.com/id/16793043/ CS61C L05 Introduction to C (pt 3) (1) QuickTime™ and a TIFF (Uncompressed) decompressor are needed to see this picture. QuickTime™ and a TIFF (U ncompressed) decompressor are needed to see t his picture. Garcia, Spring 2007 © UCB Review • Pointers and arrays are virtually same • C knows how to increment pointers • C is an efficient language, with little protection • Array bounds not checked • Variables not automatically initialized • (Beware) The cost of efficiency is more overhead for the programmer. • “C gives you a lot of extra rope but be careful not to hang yourself with it!” CS61C L05 Introduction to C (pt 3) (2) Garcia, Spring 2007 © UCB C Strings • A string in C is just an array of characters. char string[] = "abc"; • How do you tell how long a string is? • Last character is followed by a 0 byte (null terminator) int strlen(char s[]) { int n = 0; while (s[n] != 0) n++; return n; } CS61C L05 Introduction to C (pt 3) (3) Garcia, Spring 2007 © UCB Pointers (1/4) …review… • Sometimes you want to have a procedure increment a variable? • What gets printed? void AddOne(int x) { x = x + 1; } y = 5 int y = 5; AddOne( y); printf(“y = %d\n”, y); CS61C L05 Introduction to C (pt 3) (4) Garcia, Spring 2007 © UCB Pointers (2/4) …review… • Solved by passing in a pointer to our subroutine. • Now what gets printed? void AddOne(int *p) { *p = *p + 1; } y = 6 int y = 5; AddOne(&y); printf(“y = %d\n”, y); CS61C L05 Introduction to C (pt 3) (5) Garcia, Spring 2007 © UCB Pointers (3/4) • But what if what you want changed is a pointer? • What gets printed? void IncrementPtr(int { p = p + 1; } *p) int A[3] = {50, 60, 70}; int *q = A; IncrementPtr( q); printf(“*q = %d\n”, *q); CS61C L05 Introduction to C (pt 3) (6) *q = 50 Aq 50 60 70 Garcia, Spring 2007 © UCB Pointers (4/4) • Solution! Pass a pointer to a pointer, declared as **h • Now what gets printed? void IncrementPtr(int **h) *q = 60 { *h = *h + 1; } q Aq int A[3] = {50, 60, 70}; int *q = A; IncrementPtr(&q); printf(“*q = %d\n”, *q); CS61C L05 Introduction to C (pt 3) (7) 50 60 70 Garcia, Spring 2007 © UCB Dynamic Memory Allocation (1/4) • C has operator sizeof() which gives size in bytes (of type or variable) • Assume size of objects can be misleading and is bad style, so use sizeof(type) • Many years ago an int was 16 bits, and programs were written with this assumption. • What is the size of integers now? • “sizeof” knows the size of arrays: int ar[3]; // Or: int ar[] = {54, 47, 99} sizeof(ar) 12 • …as well for arrays whose size is determined at run-time: int n = 3; int ar[n]; // Or: int ar[fun_that_returns_3()]; sizeof(ar) 12 CS61C L05 Introduction to C (pt 3) (8) Garcia, Spring 2007 © UCB Dynamic Memory Allocation (2/4) • To allocate room for something new to point to, use malloc() (with the help of a typecast and sizeof): ptr = (int *) malloc (sizeof(int)); • Now, ptr points to a space somewhere in memory of size (sizeof(int)) in bytes. •(int *) simply tells the compiler what will go into that space (called a typecast). • malloc is almost never used for 1 var ptr = (int *) malloc (n*sizeof(int)); • This allocates an array of n integers. CS61C L05 Introduction to C (pt 3) (9) Garcia, Spring 2007 © UCB Dynamic Memory Allocation (3/4) • Once malloc() is called, the memory location contains garbage, so don’t use it until you’ve set its value. • After dynamically allocating space, we must dynamically free it: free(ptr); • Use this command to clean up. • Even though the program frees all memory on exit (or when main returns), don’t be lazy! • You never know when your main will get transformed into a subroutine! CS61C L05 Introduction to C (pt 3) (10) Garcia, Spring 2007 © UCB Dynamic Memory Allocation (4/4) • The following two things will cause your program to crash or behave strangely later on, and cause VERY VERY hard to figure out bugs: • free()ing the same piece of memory twice • calling free() on something you didn’t get back from malloc() • The runtime does not check for these mistakes • Memory allocation is so performance-critical that there just isn’t time to do this • The usual result is that you corrupt the memory allocator’s internal structure • You won’t find out until much later on, in a totally unrelated part of your code! CS61C L05 Introduction to C (pt 3) (11) Garcia, Spring 2007 © UCB Binky Pointer Video (thanks to NP @ SU) QuickTime™ and a Cinepak decompressor are needed to see this picture. CS61C L05 Introduction to C (pt 3) (12) Garcia, Spring 2007 © UCB Arrays not implemented as you’d think void int p = q = foo() { *p, *q, x, a[1]; // a[] = {3} also works here (int *) malloc (sizeof(int)); &x; *p = 1; // p[0] would also work here *q = 2; // q[0] would also work here *a = 3; // a[0] would also work here printf("*p:%u, p:%u, &p:%u\n", *p, p, &p); printf("*q:%u, q:%u, &q:%u\n", *q, q, &q); printf("*a:%u, a:%u, &a:%u\n", *a, a, &a); } ... 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 ... ? 2? 3? ? 32 52 p q x a ... ? 1 unnamed-malloc-space *p:1, p:52, &p:24 *q:2, q:32, &q:28 *a:3, a:36, &a:36 CS61C L05 Introduction to C (pt 3) (13) Garcia, Spring 2007 © UCB C structures : Overview • A struct is a data structure composed from simpler data types. • Like a class in Java/C++ but without methods or inheritance. struct point { int x; int y; }; /* type definition */ void PrintPoint(struct point p) { As always in C, the argument is passed by “value” – a copy is made. printf(“(%d,%d)”, p.x, p.y); } struct point p1 = {0,10}; /* x=0, y=10 */ PrintPoint(p1); CS61C L05 Introduction to C (pt 3) (14) Garcia, Spring 2007 © UCB C structures: Pointers to them • Usually, more efficient to pass a pointer to the struct. • The C arrow operator (->) dereferences and extracts a structure field with a single operator. • The following are equivalent: struct point *p; /* code to assign to pointer */ printf(“x is %d\n”, (*p).x); printf(“x is %d\n”, p->x); CS61C L05 Introduction to C (pt 3) (15) Garcia, Spring 2007 © UCB Kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Kind Meek Giggles Tease Peering Excited Zealous Youngsters. – Yiding J Kissing me gives tears per extra zebra YO! – Peter D Kiss me, gimme tea, persistently extol zee. You! – Hava E Kia Mechanics (are) Giant Terrible People Exclaiming Zealous Yodels. – Gary M Kiss me, gimme tea, pet exaltingly, zestful you. – Hava E Kid meets giant Texas people exercising zen-like yoga. -Rolf O Kicking methods gives teaching people extra zest, youbetcha! – Peter D Kind men give ten percent extra, zestfully, youthfully. – Hava E Kissing Mentors Gives Testy Persistent Extremists Zealous Youthfulness. – Gary M Kindness means giving, teaching, permeating excess zero, zeal yourself. – 1. Killing messengers gives terrible people exactly yo Hava E 2. Kindergarten means giving teachers perfect–examples (of)ideas zeal (& Kissing me gives ten percent extra zeal & youth! Dan (taking from all) 3. Kissing mediocre girls/guys teaches people (to) expect zero (from 4. Kinky Mean Girls Teach Penis-Extending Zen Yoga 5. Kissing Mel Gibson, Teddy Pendergrass exclaimed: “Zesty, yo!” – CS61C L05 Introduction to C (pt 3) (16) Garcia, Spring 2007 © UCB Pointer Arithmetic Peer Instruction Q How many of the following are invalid? #invalid I. II. III. IV. V. VI. VII. VIII. IX. X. pointer + integer integer + pointer pointer + pointer pointer – integer integer – pointer pointer – pointer compare pointer to pointer compare pointer to integer compare pointer to 0 compare pointer to NULL CS61C L05 Introduction to C (pt 3) (17) 1 2 3 4 5 6 7 8 9 (1)0 Garcia, Spring 2007 © UCB Peer Instruction Which are guaranteed to print out 5? I: main() { int *a-ptr; *a-ptr = 5; printf(“%d”, *a-ptr); } II: main() { int *p, a = 5; p = &a; ... /* code; a & p NEVER on LHS of = */ printf(“%d”, a); } III: main() { int *ptr; ptr = (int *) malloc (sizeof(int)); *ptr = 5; printf(“%d”, *ptr); } CS61C L05 Introduction to C (pt 3) (19) 0: 1: 2: 3: 4: 5: 6: 7: I II III YES YES YES YES YES YES YES YES YES YES YES YES Garcia, Spring 2007 © UCB Peer Instruction int main(void){ int A[] = {5,10}; int *p = A; 5 10 A[0] A[1] p printf(“%u %d %d %d\n”,p,*p,A[0],A[1]); p = p + 1; printf(“%u %d %d %d\n”,p,*p,A[0],A[1]); *p = *p + 1; printf(“%u %d %d %d\n”,p,*p,A[0],A[1]); } If the first printf outputs 100 5 5 10, what will the other two printf output? 1: 2: 3: 4: 5: 6: 101 10 5 10 then 104 10 5 10 then 101 <other> 5 10 then 104 <other> 5 10 then One of the two printfs I surrender! CS61C L05 Introduction to C (pt 3) (20) 101 11 5 11 104 11 5 11 101 <3-others> 104 <3-others> causes an ERROR Garcia, Spring 2007 © UCB “And in Conclusion…” • Use handles to change pointers • Create abstractions with structures • Dynamically allocated heap memory must be manually deallocated in C. • Use malloc() and free() to allocate and deallocate memory from heap. CS61C L05 Introduction to C (pt 3) (21) Garcia, Spring 2007 © UCB Bonus slides • These are extra slides that used to be included in lecture notes, but have been moved to this, the “bonus” area to serve as a supplement. • The slides will appear in the order they would have in the normal presentation CS61C L05 Introduction to C (pt 3) (22) Garcia, Spring 2007 © UCB How big are structs? • Recall C operator sizeof() which gives size in bytes (of type or variable) • How big is sizeof(p)? struct p { char x; int y; }; • 5 bytes? 8 bytes? • Compiler may word align integer y CS61C L05 Introduction to C (pt 3) (23) Garcia, Spring 2007 © UCB Linked List Example • Let’s look at an example of using structures, pointers, malloc(), and free() to implement a linked list of strings. /* node structure for linked list */ struct Node { char *value; struct Node *next; }; Recursive definition! CS61C L05 Introduction to C (pt 3) (24) Garcia, Spring 2007 © UCB typedef simplifies the code struct Node { char *value; struct Node *next; }; String value; /* "typedef" means define a new type */ typedef struct Node NodeStruct; … OR … typedef struct Node { char *value; struct Node *next; /* Note similarity! */ } NodeStruct; /* To define 2 nodes */ … THEN typedef NodeStruct *List; typedef char *String; CS61C L05 Introduction to C (pt 3) (25) struct Node { char *value; struct Node *next; } node1, node2; Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } { String s1 = "abc", s2 = "cde"; List theList = NULL; theList = cons(s2, theList); theList = cons(s1, theList); /* or, just like (cons s1 (cons s2 nil)) */ theList = cons(s1, cons(s2, NULL)); CS61C L05 Introduction to C (pt 3) (26) Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } node: list: … ? … NULL s: "abc" CS61C L05 Introduction to C (pt 3) (27) Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } list: node: … ? ? CS61C L05 Introduction to C (pt 3) (28) … NULL s: "abc" Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } list: node: … ? "????" CS61C L05 Introduction to C (pt 3) (29) … NULL s: "abc" Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } list: node: … ? "abc" CS61C L05 Introduction to C (pt 3) (30) … NULL s: "abc" Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } list: node: … NULL s: "abc" CS61C L05 Introduction to C (pt 3) (31) … "abc" Garcia, Spring 2007 © UCB Linked List Example /* Add a string to an existing list, 2nd call */ List cons(String s, List list) { List node = (List) malloc(sizeof(NodeStruct)); node->value = (String) malloc (strlen(s) + 1); strcpy(node->value, s); node->next = list; return node; } node: … NULL s: "abc" CS61C L05 Introduction to C (pt 3) (32) … "abc" Garcia, Spring 2007 © UCB Pointer Arithmetic Summary • x = *(p+1) ? x = *(p+1) ; • x = *p+1 ? x = (*p) + 1 ; • x = (*p)++ ? x = *p ; *p = *p + 1; • x = *p++ ? (*p++) ? *(p)++ ? *(p++) ? x = *p ; p = p + 1; • x = *++p ? p = p + 1 ; x = *p ; • Lesson? • These cause more problems than they solve! CS61C L05 Introduction to C (pt 3) (33) Garcia, Spring 2007 © UCB Kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta • Kim’s melodious giddiness terrifies people, excepting zealous yodelers • Kirby Messed Gigglypuff Terribly, (then) Perfectly Exterminated Zelda and Yoshi • Killed meat gives teeth peace except zebra yogurt • Kind Men Give Tense People Extra Zeal (for) Yoga • Killing melee gives terror; peace exhibits Zen yoga • Young Zebras Exclaim, “People Teach {Giraffes, Girls} Messy Kissing!” – Omar Akkawi • “King me,” Gina tells Perry, expert zebra yodeler – Diana Ko • Kirk met Gibson’s team, perilously expecting zealous youngsters – Diana Ko • Kind Men Give Ten Percent Expressly Zee Yoorphans – Daniel Gallagher • King Mel Gibson Tells People “Examine Ze Yoodle!” – Daniel Gallagher • Kizzle Meh Gizzle The Pezzle Exizzle Zeh Yo! – Daniel Gallagher • Killer Mechanical { Giraffe / Giant } Teaches Pet, Extinct Zebra, to Yodel – Larry Ly • Kilted Men Given Testosterone Perform Exceedingly Zealous Yoga –David CS61C L05 Introduction to C (pt 3) (34) Garcia, Spring 2007 © UCB