The following problems assume that you are familiar with the system calls to allocate and deallocate dynamic memory.
Consider the following C program:
#define SIZE 100 int main(int argc, char *argv[]) { int i, j; int *ptr; for (i = 0; i < SIZE; i++) { ptr = (int *)malloc(SIZE * sizeof(int)); for (j = 0; j < SIZE; j++) { ptr[j] = j; } } ptr = NULL; }
How many memory leaks has this code fragment? How much memory leaks?
A programmer works with a linked list of words. Each element has a pointer to a chain and a pointer to the next. The list is represented by a pointer to its first element. The code for the function to delete a list is the following:
struct list_node { char *word; struct list_node *next; }; void delete(struct list_node *l) { struct list_node *tmp; while (l->next != NULL) { tmp = l; free(l->word); l = l->next; free(l); } }
After using a program to detect memory leaks, the report says that there are certain memory blocks not freed. The programmer has detected that the problem is in this function, but where exactly? (Hint: Draw first an example with a linked list and see how the function performs the deletion)
What happens if an empty list is deleted? This means that
l
is NULL
.
A program needs to manipulate a binary tree (every node has two and only two children). The data structure used is the following:
struct tree_node { int value; struct tree_node *left; struct tree_node *right; };
A node with no children is represented with the two pointers to NULL.
Write a function that given an integer it returns a terminal node with the given value stored. The function must create that node. The function prototype is the following:
struct tree_node *node(int v);
Write a function that given an integer and two pointers to nodes (already created), returns a new node with the integer stored as value and the two pointers as children. The function prototype is the following:
struct tree_node *create_node(int v, struct tree_node *left, struct tree_node *right);
Write now the main
function that using
the two previous functions created the tree shown in the following
figure:
Write a function that given a pointer to a node, frees the space it occupies. No operation is done on the children, they are assumed to be already deallocated. The function prototype is:
void delete(struct tree_node *t);
Using the previous function, write another function that given a pointer to a node, deallocates all the nodes in that tree (watch out, this is not a trivial function, if you cannot write it, check with us). The function prototype is:
void delete_tree(struct tree_node *t);
An application that executes in your mobile phone has the following data structure already created and based in the following definitions:
struct vendor { char *vendor_name; int installation_date; int price; }; struct program { char *path; struct stats { int uses; int last_use; } statistics; struct vendor *vendor_info; }; struct program *installed_applications; int number_of_installed_applications;
The program has dynamically reserved (through
malloc
) an array with as many data structures of type
program
as indicated in the variable
number_of_installed_applications
and has stored this pointer in
installed_applications
. Each element of type struct
program
has its fields path
and
vendor_info
dynamically allocated.In a similar way,
each element of type struct vendor
has its field
vendorname
dynamically allocated
Write a function that receives a pointer of type
struct program *
to a table like the one stored in
installed_applications
and its size as an integer, and fees
the space occupied by the data type. The prototype of this function
is:
void delete(struct program *table, int size);