Monday, April 27, 2015

Trong bài viết trước đã nêu chi tiết về con trỏ Pointer , trong đó pointer trỏ đến các biến có sẵn đã được khai báo trước, còn trong bài viết này pointer được dùng để quản lý một vùng nhớ được cấp phát động trong lúc chương trình chạy. Các thao tác của pointer bao gồm: trỏ đến vùng nhớ được cấp phát, thay đổi giá trị của vùng nhớ và cuối cùng phải giải phóng vùng nhớ khi không cần dùng đến nó nữa.

Include header

 #include <stdlib.h>   


S.N. Function and Description
1 void *calloc(int num, int size);
This function allocates an array of num elements each of which size in bytes will besize.
2 void free(void *address);
This function release a block of memory block specified by address.
3 void *malloc(int num);
This function allocates an array of num bytes and leave them initialized.
4 void *realloc(void *address, int newsize);
This function re-allocates memory extending it upto newsize.
Note:
+ Các hàm calloc, malloc, realloc sẽ trả về địa chỉ vùng nhớ mà nó được cấp, nếu không sẽ trả về NULL trong trường hợp cấp phát thất bại vì một lý do nào đó, ví dụ như thiếu bộ nhớ chẳng hạn (out of memory). Vì thế để chắc chắn phải có thêm thao tác kiểm tra xem cấp phát thành công hay không, để loại trừ trường hợp cấp phát fail mà lại thao tác giá trị trên con trỏ làm chương trình bị crash
+ Nên có thêm phần ép kiểu cho con trỏ được cấp phát, mặc định các hàm trả về void pointer
+ Khi giải phóng pointer cũng cần kiểm tra xem pointer đó có trỏ đến vùng nhớ nào không thì mới giải phóng được, free một con trỏ không trỏ vào vùng nhớ nào (NULL) cũng làm chương trình bị crash

Ex:
memory.c
 #include <stdio.h>  
 #include <stdlib.h>  
 int main()  
 {  
   //=============== MALLOC ================  
   int *p = NULL;    
   p = (int*)malloc(sizeof(int));  
   if(p){  
     printf("Gia tri cua p: %x \n", p); /* chua dia chi cua vung nho vua duoc cap phat boi lenh malloc */  
     printf("Gia tri vung nho ma p tro den: %d \n", *p);  
     *p = 10;  
     printf("Gia tri cua p: %x \n", p);  
     printf("Gia tri vung nho ma p tro den: %d \n", *p);  
   }    
   if(p){  
     free(p);  
   }  
   //=============== CALLOC ================  
   int *pcalloc = NULL;  
   pcalloc = (int*)calloc(1, sizeof(int));  
   if(pcalloc){  
     *pcalloc = 20;  
     printf("Gia tri cua pcalloc: %x \n", pcalloc);  
     printf("Gia tri vung nho ma pcalloc tro den: %d \n", *pcalloc);  
   }  
   if(pcalloc){  
     free(pcalloc);  
   }  
   return 0;  
 }  

Compile & Execute
 $ gcc memory.c   
 $ ./a.out   
 Gia tri cua p: 240b010   
 Gia tri vung nho ma p tro den: 0   
 Gia tri cua p: 240b010   
 Gia tri vung nho ma p tro den: 10   
 Gia tri cua pcalloc: 240b010   
 Gia tri vung nho ma pcalloc tro den: 20  

Hình dưới mô tả hoạt động của con trỏ p quản lý bộ nhớ

Trong trường hợp cấp phát nhiều element, khi đó p sẽ trỏ đến element đầu tiên, muốn duyệt tất cả các element thì cần dùng một con trỏ khác là p2 để thao tác bằng phép nhảy đến phần tử tiếp theo p2++

memory-1.c
 #include <stdio.h>  
 #include <stdlib.h>  
 #define MAX_ELEMENT 2  
 int main()  
 {  
   int *p = NULL;  
   int *p2 = NULL;  
   p = (int*)malloc(MAX_ELEMENT*sizeof(int)); /* malloc 2 element */  
   if(!p){  
     printf("malloc FAIL ! \n");  
     return 0;  
   }  
   p2 = p;  
   int i;  
   for(i = 0; i < MAX_ELEMENT; i++){  
     *p2 = (i+1);  
     printf("p value: %d \n", *p2);  
     p2++;  
   }  
   if(p){  
     free(p);  
   }  
   return 0;  
 }  





{ 1 nhận xét... read them below or add one }

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -