Malloc an Array int *a; a = malloc(n * sizeof(int)); Can we just say a = malloc(n* 4) ? Not a good idea After malloc, you have all the space needed for the array allocated After that, you can use a[i] or *(a+i) to access the elements
Calloc an Array int *a; A = calloc(n, sizeof(int)); Why do we use calloc? All elements are initialized to 0 at the time of allocation
Realloc an Array int *a; a = malloc(n * sizeof(int)); a = realloc(a, m * sizeof(int)); Why do we use realloc? So we can change its size after we malloc or calloc If first argument is null, realloc = malloc If second argument is zero, the memory is freed
Strings In C, strings are equivalent to a collection (array) of characters How do we setup a string? char quarterback = “Palmer”; 7 bytes are allocate for variable name. What if Mannings replaced Palmer as QB? char director; Let’s say, a guy named Roethlisberger comes along. char * quarterback; quarterback = (char *) malloc (15);
How do we use malloc with strings? char * temp_buffer = (char *) malloc(20); char * name; char * title; scanf(“%s”, temp_buffer); name = (char *) malloc(strlen(temp_buffer)); strcpy(name, temp_buffer); strcpy(temp_buffer, “□ □ □ □ … □”); □ x 20 scanf(“%s”, temp_buffer); title = (char *) malloc(strlen(temp_buffer)); strcpy(title, temp_buffer);
Array of strings If there are multiple strings, we can use a 2 dimensional array to store it. But it waste too much space, instead we store an array of pointers to strings char * strings[NUMBER_OF_STRINGS]; strings, strings, …
Recycle Memory leak Free p = malloc(…); free(p); Calling free to a memory location, not previously allocated dynamically (e.g. an element of array, a variable) can have unpredictable effect Dangling pointer: refer to the pointer pointing to an address that is already freed Some programmers put p = null; whenever they free the memory p points to.
Strings String: an array of characters String constant (String literals) String variable