C Programming : Dynamic memory allocation & Structures 2008/11/19 Made by Jimin Hwa...

17
C Programming : Dynamic memory allocation & Structures 2008/11/19 Made by Jimin Hwa ([email protected]) Edited and presented by Souneil Park ([email protected])

Transcript of C Programming : Dynamic memory allocation & Structures 2008/11/19 Made by Jimin Hwa...

C Programming :Dynamic memory allocation &

Structures

2008/11/19

Made by Jimin Hwa ([email protected])

Edited and presented by Souneil Park ([email protected])

Contents Dynamic memory allocation Structure Linked list

2

Motivation of Dynamic Allocation The allocated space of an array is not flexible

What if more space is required?

Data insertion/deletion is difficult

3

char [] “CC510”

1 2 3 4 5 6 7 8

9 10

int []

Dynamic Memory Allocation malloc

Allocates size bytes and returns a pointer to the allocated memory.

4

int *pi;int size, i;

scanf(“%d”, &size);pi = (int *)malloc(sizeof(int) * size); // (type): static type castingfor (i = 0; i < size; i++) // Initialization

pi[i] = -1;

void* malloc(size_t size) /* <stdlib.h> : malloc/calloc/realloc */

Dynamic Memory Allocation (Cont’d) calloc – initializes memory before allocation

Allocates size bytes, initialize the space with 0, and returns a pointer to the allocated memory

5

void* calloc(size_t nmeb, size_t size)

int *pi;int size, i;

scanf(“%d”, &size);pi = (int *)calloc(size, sizeof(int)); // (type): static type casting

Dynamic Memory Deallocation Synopsis

Frees the memory space pointed by ptr.

Frees(deallocates) the dynamically allocated memory space

6

void free(void *ptr) /* <stdlib.h> : free */

int *pi;int size, i;

scanf(“%d”, &size);pi = (int *)malloc(sizeof(int) * size);

if (pi != NULL) { free(pi); pi = NULL;

}

Structure

7

Structure(Cont’d)

8

struct student { /* struct struct_name{ */ char name[32]; /* definition of members */ int student_id; /* }; */char grade;

};

struct class {struct student member[100];int num_of_students;int average_grade;

};

int main(){struct class CC510; /* struct struct_name var_name */…

}

Structure Operators Operator for member access : “.” (dot)

connects the structure name and the member namestructure_name.member

Example> struct student john;

john.grade = ‘A’;

john.student_id = 4473;

int id = john.student_id;

operator for member access (pointer) : -> Exmple> struct student *pJohn;

pJohn->grade = ‘A’; // (*pJohn).grade = ‘A’;

pJohn->student_id = 4473;

int id = john->student_id; 9

Structure Operators(Cont’d) Assignment between structure variable: “=“

Example>

10

struct student John;struct student John_clone;

John.name = “John”;John.grade = ‘A';John.student_id = 945433;John_clone = John; /* John_clone.name = = “John”,

John_clone.grade = = ‘A‘, John_clone.student_id = = 945433

*/

Structure Comparison

11

if(john == john_clone){ … } /* Wrong */

if(strcmp(John.name, john_clone.name) == 0 && John.student_id == john_clone.student_id && …){…} /*Right */

Structure as a Function Argument They are passed to functions by the usual

parameter-passing mechanism The entire structure is copied to the function

Example>

12

int fail(struct student of_classA[], int size) {

int i, count = 0;for (i=0; i < size; ++i){

if(of_class[i].grade == ‘F’) count ++;}return count

}

Linked List An alternative to array. Data structure in which objects are arranged in a

linear order Consists of nodes, each containing arbitrary data fields and

link pointing to the next nodes. The size of a linked list would be changed in runtime.

13

8 7 2 7 1 7

Node

LinkData field

HEAD X

Linked List Implementation An node is represented in a C structure. malloc() is used to dynamically create node structure

14

typedef struct node_t {int data;struct _node_t *next;

} node_t;

node_t head;

head.next = NULL;/* Linked list is empty */

node_t* create_node(int d){ node_t *n =

(node_t*)malloc(sizeof(node_t));

if (!n) return NULL;

n->data = d; n->next = NULL; return n; }

LAB #7 - 1 Implement a circular list

Get input from users (through standard input) Input is an integer

Whenever a user enters an positive integer, Store the input at the last First, print the 1st, 3rd, 5th, … element Then, print the 2nd, 4th, 6th, … element

If zero or a negative integer is entered, terminate the program.

15

LAB #7 - 2 Implement a clist_copy function which copies the

circular list (struct xxx *) clist_copy (struct xxx *head) {

….

} Which returns the head of the copied circular list In the main function,

Print the head address of the original list and the copied list Print the elements of the copied circular list in a sequential

order

16

The End Any Question?

17