Post on 16-Dec-2015
transcript
C Programming :Dynamic memory allocation &
Structures
2008/11/19
Made by Jimin Hwa (jmhwa@se.kaist.ac.kr)
Edited and presented by Souneil Park (spark@nclab.kaist.ac.kr)
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(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