DOC PREVIEW
UW CSE 303 - Lecture Notes

This preview shows page 1-2-21-22 out of 22 pages.

Save
View full document
View full document
Premium Document
Do you want full access? Go Premium and unlock all 22 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 22 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 22 pages.
Access to all documents
Download any document
Ad free experience
View full document
Premium Document
Do you want full access? Go Premium and unlock all 22 pages.
Access to all documents
Download any document
Ad free experience
Premium Document
Do you want full access? Go Premium and unlock all 22 pages.
Access to all documents
Download any document
Ad free experience

Unformatted text preview:

Slide 1Upcoming schedulefree: releases memoryMemory corruptionStructured dataUsing structstypedefStructs as parametersPointers to structsThe -> operatorCopy by assignmentStruct as return valueComparing structsComparing structs, cont'dStructs and inputArrays of structsStructs with pointersAlternativeLinked data structuresManipulating a linked listExerciseQuestions?David Notkin  Autumn 2009  CSE303 Lecture 13This space for rentUpcoming scheduleCSE303 Au09 2Today10/23Monday10/26Wednesday10/28Friday10/30Monday11/2Finish-up WednesdaySome specifics for HW3Social implications FridayMemory management MidtermreviewMidterm•structured data•struct, typedef•structs as parameters/returns•arrays of structs•linked data structures•stacks•linked listsfree: releases memory•free(pointer);•Releases the memory pointed to by the given pointer–precondition: pointer must refer to a heap-allocated memory block that has not already been freed–it is considered good practice to set a pointer to NULL after freeingint* a = (int*) calloc(8, sizeof(int));...free(a);a = NULL;Memory corruption•If the pointer passed to free doesn't point to a heap-allocated block, or if that block has already been freed, bad things happen–you're lucky if it crashes, rather than silently corrupting somethingint* a1 = (int*) calloc(1000, sizeof(int));int a2[1000];int* a3;int* a4 = NULL;free(a1); // okfree(a1); // bad (already freed)free(a2); // bad (not heap allocated)free(a3); // bad (not heap allocated)free(a4); // bad (not heap allocated)Structured data•struct: A type that stores a collection of variables–like a Java class, but with only fields (no methods or constructors)–instances can be allocated on the stack or on the heapstruct Point { // defines a new structured int x, y; // type named Point};Using structs•Once defined, a struct instance is declared just like built-in types (e.g., int, char) except preceded by struct–this allocates an instance on the stack–name fields of a struct using the . operatorstruct Point { int x, y;};int main(void) { struct Point p1; struct Point p2 = {42, 3}; p1.x = 15; p1.y = -2; printf("p1 is (%d, %d)\n", p1.x, p1.y); return 0;}typedef•Tell C to acknowledge your struct type's name with typedeftypedef struct Point { int x, y;} Point;int main(void) { Point p1; // don't need to write 'struct' p1.x = 15; p1.y = -2; printf("p1 is (%d, %d)\n", p1.x, p1.y); return 0;}Structs as parameters•when you pass a struct as a parameter, it is copied–not passed by reference as in Javaint main(void) { Point p = {10, 20}; swapXY(p); printf("(%d, %d)\n", p.x, p.y); return 0; // prints (10, 20)}void swapXY(Point a) { int temp = a.x; a.x = a.y; a.y = temp; // does not work}Pointers to structs•structs can be passed using pointers–must use parentheses when dereferencing a struct* (because of operator precedence)int main(void) { Point p = {10, 20}; swapXY(&p); printf("(%d, %d)\n", p.x, p.y); return 0; // prints (20, 10)}void swapXY(Point* a) { int temp = (*a).x; (*a).x = (*a).y; (*a).y = temp;}The -> operator•We often allocate structs on the heap–pointer->field is equivalent to (*pointer).fieldint main(void) { Point* p = (Point*) malloc(sizeof(Point)); p->x = 10; p->y = 20; swapXY(p); printf("(%d, %d)\n", p->x, p->y); // (20, 10) return 0;}void swapXY(Point* a) { int temp = a->x; a->x = a->y; a->y = temp;}Copy by assignment•One struct's entire contents can be copied to another with =–struct2 = struct1; // copies the memoryint main(void) { Point p1 = {10, 20}, p2 = {30, 40}; p1 = p2; printf("(%d, %d)\n", p1.x, p1.y); // (30, 40) // is this the same as p1 = p2; above? Point* p3 = (Point*) malloc(sizeof(Point)); Point* p4 = (Point*) malloc(sizeof(Point)); p3->x = 70; p3->y = 80; p3 = p4; printf("(%d, %d)\n", p3->x, p3->y);}Struct as return value•We generally pass/return structs as pointers–takes less memory (and time) than copying–if a struct is malloc-ed and returned as a pointer, who frees it?int main(void) { Point* p1 = new_Point(10, 20); ... free(p1);}// creates/returns a Point; sort of a constructorPoint* new_Point(int x, int y) { Point* p = (Point*) malloc(sizeof(Point)); p->x = x; p->y = y; return p; // caller must free p later}Comparing structs•relational operators (==, !=, <, >, <=, >=) don't work with structsPoint p1 = {10, 20};Point p2 = {10, 20};if (p1 == p2) { ... // error•what about this?Point* p1 = new_Point(10, 20);Point* p2 = new_Point(10, 20);if (p1 == p2) { ... // true or false?Comparing structs, cont'd•the right way to compare two structs: write your own#include <stdbool.h>bool point_equals(Point* a, Point* b) { if (a->x == b->x && a->y == b->y) { return true; } else { return false; }}int main(void) { Point p1 = {10, 20}; Point p2 = {10, 20}; if (point_equals(&p1, &p2)) { ...Structs and input•you can create a pointer to a field of a struct–structs' members can be used as the target of a scanf, etc.int main(void) { Point p; printf("Please type your x/y position: "); scanf("%d %d", &p.x, &p.y);}int main(void) { Point* p = (Point*) malloc(sizeof(Point)); printf("Please type your x/y position: "); scanf("%d %d", &p->x, &p->y);}Arrays of structs•parallel arrays are conceptually linked by their index–parallel arrays are usually bad design; isn't clear that they are related–you should often replace such arrays with an array of structsint id[50]; // parallel arrays to storeint year[50]; // student data (bad)double gpa[50];typedef struct Student { int id, year; double gpa;} Student;Student students[50];Structs with pointers•What if we want a Student to store a significant other?typedef struct Student { // incorrect .. Why? int id, year; double gpa; struct Student sigother;} Student;•When to stop the recursion?–a Student cannot fit another entire Student inside of it!Alternativetypedef struct Student { // correct int id, year; double gpa; struct Student* sigother;} Student;CSE303 Au09 18Linked data structures•C does not include collections like Java's ArrayList, HashMap–must build any needed data structures manually–to build a linked list structure, create a chain of


View Full Document

UW CSE 303 - Lecture Notes

Documents in this Course
Profiling

Profiling

11 pages

Profiling

Profiling

22 pages

Profiling

Profiling

11 pages

Testing

Testing

12 pages

Load more
Download Lecture Notes
Our administrator received your request to download this document. We will send you the file to your email shortly.
Loading Unlocking...
Login

Join to view Lecture Notes and access 3M+ class-specific study document.

or
We will never post anything without your permission.
Don't have an account?
Sign Up

Join to view Lecture Notes 2 2 and access 3M+ class-specific study document.

or

By creating an account you agree to our Privacy Policy and Terms Of Use

Already a member?