+ All Categories
Home > Documents > CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2:...

CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2:...

Date post: 17-Dec-2015
Category:
Upload: amelia-gregory
View: 217 times
Download: 3 times
Share this document with a friend
28
CS 241 Section Week #2 2/4/10
Transcript
Page 1: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

CS 241Section Week #2

2/4/10

Page 2: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

2

Topics This Section

• MP1 overview•Part1: Pointer manipulation•Part2: Basic dictionary structure implementation

• Review of strings• Memory allocation and free• Process creation using fork()

Page 3: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

3

MP1 part1: Pointers• mp1-functions.c contains 12 different

functions, each of which print out “Illinois”• Edit part1.c to print out 12 "Illinois" lines• To print a "Illinois" line, formulate the

parameter(s) to the corresponding function appropriately

• Do NOT modify mp1-functions.c

Page 4: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

4

Review of Pointers

• The & operator creates a pointer to a variable int x;

int *xptr = &x; // xptr = 0xAF981DF8

• The * operator reads the data which a pointer referencesint y = *xptr; // y = x

Page 5: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

5

Pointer arithmetic

char a[8]; /* array of bytes */

char *p = a; /* p, a: 0xAF99EFDC */

char *q = a+3; /* q: 0xAF99EFDF */

( a+3 and &a[3] are the same )

......

......

......

Page 6: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

6

Pointer arithmetic (2)

int b[2]; /* array of 4-byte words */

int *q = b+1; /* q: 0xAF99EFE0 */

char *r = &b[1]; /* r: 0xAF99EFE0 */

......

......

......

Page 7: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

7

MP1 part2: Dictionary data structure

• Implement a basic dictionary data structure• Defined in libdictionary/libdictionary.h

typedef struct _dictionary_t{ char *key, *value;

struct _dictionary_t *next;

}

Host: www.cs.uiuc.edu

key = Host

value = www.cs.uiuc.edu

Page 8: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

8

Dictionary files

• part2.c – Provides a simple program to populate the

dictionary from a file• libdictionary/libdictionary.h– Contains definition of the dictionary data

structure (struct dictionary_t) and its six functions

• libdictionary/libdictionary.c– Implement the functions here

Page 9: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

9

Dictionary functions• int dictionary_init(dictionary_t *d)

• int dictionary_add(dictionary_t *d, char *key, char *value)

• void dictionary_remove(dictionary_t *d, char *key)

• int dictionary_parse(dictionary_t *d, char *key_value)

• void dictionary_print(dictionary_t *d)

• void dictionary_destroy(dictionary_t *d)

Page 10: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

10

Dictionary functions• int dictionary_init(dictionary_t *d)

– Initialize data structure `d`– Return value• 0: if initialization successful• Non-zero integer: otherwise

• int dictionary_destroy(dictionary_t *d)

– Remove all entries from `d` (uses dictionary_remove function)

– Free up any other memory associated with `d`

Page 11: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

11

Dictionary functions• int dictionary_add(dictionary_t *d, char *key, char *value)

– add (key, value) pair to dictionary `d`– DO NOT edit `d` if the key already exists– Return value• non-zero integer: if key already exists• 0: otherwise

–Make a copy of the strings `key` and `value` before adding them to `d`

Page 12: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

12

Dictionary functions• void dictionary_remove(dictionary_t *d, char *key)

– remove (key, value) pair from dictionary `d` if key exists

– Free the memory allocated during dictionary_add function call

Page 13: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

13

Dictionary functions• int dictionary_parse(dictionary_t *d, char *key_value)

• Parameter key_value will be formatted as an HTTP header (key_field: value_field)

• Add (key_field, value_field) pair to `d` using dictionary_add(...)

• Return value– Non-zero integer: If key_value does not comply

with the format or if the call to dictionary_add(...) fails

– 0: otherwise

Page 14: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

14

Dictionary functions• void dictionary_print(dictionary_t *d)

– Print out the entire contents of the dictionary `d`– Print out format• printf("%s: %s", key, value);

• where key and value are variables storing the (key, value) pair of the entry

Page 15: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

15

Review of Strings

Page 16: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

16

Strings

• Sequence of zero or more characters, terminated by NULL

• char m[10] = “dog”;•10 bytes are allocated for array `m`•Array `m` is initialized as

•char m[10] = {'d', 'o', 'g', '\0'};

Page 17: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

17

String manipulation functions

• #include <string.h> at program start• Some useful functions

• strlen• strcpy, strcat• strcmp• strstr

Page 18: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

18

String Length

size_t strlen(char *str)

• Returns the length of the string• size_t is an unsigned integer type, used to

define sizes of strings and (other) memory blocks• String length does not include NULL char m[10] = “dog”;

int len = strlen(m); // we get len = 3

Page 19: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

19

String Initialization

char *strcpy(char *dst, char const *src)char *strcat (char *dst, char const *src)

• Write src string to some dst location• Make sure:

•dst string is large enough to hold result (including NULL at the end)• src, dst regions do NOT overlap (undefined behavior in this case)

char m[10] = “dog”;

strcpy(m+1, m);

Page 20: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

20

String Comparisonint strcmp(char const *s1, char const *s2)

•Compares the string values of s1 and s2 lexicographically•Return Value

•Less than 0: if s1 precedes s2•0: if s1 and s2 value are equal•Greater than 0: if s1 follows s2

Page 21: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

21

String searchingchar *strstr(const char *haystack, const char *needle)

Returns a pointer to the first occurrence of substring needle in the string haystack

Returns NULL if the substring needle is not found

Page 22: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

22

Memory Allocation and Free

Page 23: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

23

Memory Allocation

void * malloc ( size_t size )

void *free(void *ptr)

• Cast the allocated memory to appropriate type before using itchar *s = (char*)malloc(1024*sizeof(char));

• You can only free memory which is allocated using malloc(...)

Page 24: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

24

Using valgrind to check memory leak

• To run a program ( ./part1 )• To use valgrind ( valgrind –-leak-check=full ./part1 )

• valgrind output with no memory leak

==19376== ERROR SUMMARY: 0 errors from 0 contexts

...

==19376== malloc/free: 1 allocs, 1 frees, 10 bytes allocated.

...

==19376== All heap blocks were freed -- no leaks are possible.

Page 25: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

25

valgrind output withmemory leak

• Memory is allocated using malloc(...)inside the function testmalloc(...)

==20086== ERROR SUMMARY: 1 errors from 1 contexts

...

==20086== malloc/free: 1 allocs, 0 frees, 10 bytes allocated.

...

==20086== 10 bytes in 1 blocks are definitely lost in loss record 1 of 1

==20086== at 0x4022AB8: malloc (vg_replace_malloc.c:207)

==20086== by 0x8048447: testmalloc (in /home/farhana/test)

==20086== by 0x804848A: main (in /home/farhana/test)

...

==20086== LEAK SUMMARY:

==20086== definitely lost: 10 bytes in 1 blocks.

...

Page 26: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

26

Processes

Page 27: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

27

Process creation using fork()

• A process is an instance of a running program• fork() creates a new process– In parent, fork() returns child pid– In child, fork() returns 0

• The child process is identical to the parent process, except:– Process ID (getpid())– Parent ID (getppid())

Page 28: CS 241 Section Week #2 2/4/10. 2 Topics This Section MP1 overview Part1: Pointer manipulation Part2: Basic dictionary structure implementation Review.

28

fork() example#include <stdio.h>#include <sys/types.h>#include <unistd.h>

int main() {pid_t child_pid = fork();if (child_pid < 0) { // error code

perror(“Fork Failed”);return –1;

} printf(“I'm process %d\n”,getpid());

if (child_pid == 0) { // child codeprintf(”I’m the child of parent process %d\n”, getppid());

} else { /* child_pid > 0 */ // parent codeprintf(“I’m the parent of child process %d\n”, child_pid);

}return 0;

}


Recommended