Pointer và việc định vị bộ
nhớ động
nhớ động
Để tối ưu việc sử dụng bộ nhớ, C cho phép khai báo các biến động là các biến khi cần thì xin chỗ, không cần thì giải phóng vùng nhớ để chương trình sử dụng vào mục đích khác
Các biến này được cấp phát trong vùng nhớ heap, là vùng đáy của bộ nhớ và được quản lý bởi các biến pointer
C có 2 hàm chuẩn để cấp phát bộ nhớ động: hàm malloc() và hàm calloc(); cả 2 nằm trong: stdlib.h hoặc alloc.h
void *malloc(size_t size);
Pointer và việc định vị bộ
Pointer và việc định vị bộ
nhớ động
nhớ động
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
- size_t : kiểu để khai báo kích thước khối bộ nhớ động
cần xin, có thể là int hoặc unsigned
- nitems : số phần tử cần xin
Nếu hàm này xin được khối bộ nhớ cần thiết thì chúng trả về 1 pointer trỏ đến đầu khối này. Ngược lại nó trả về con trỏ NULL, nghĩa là không sử dụng được biến động
VD: int *p;
p = (int*)malloc(10*sizeof(int)); p = (int*)calloc(10,sizeof(int));
Pointer và việc định vị bộ
Pointer và việc định vị bộ
nhớ động
nhớ động
Đối với hàm calloc() sau khi xin xong biến động, các phần tử biến động được khởi động trị bằng 0
Biến động không bị mất đi khi chương trình kết thúc nên C đưa ra hàm free() để giải phóng vùng nhớ được xin bởi hàm malloc hoặc calloc
void free(void *block);
block là pointer trỏ đến đầu khối bộ nhớ trong vùng nhớ heap cần giải phóng
VD14
#include "conio.h” #include "stdio.h” #include "alloc.h" main()
{ int i,n,s,*a;
printf("Nhap so phan tu cua mang: "); scanf("%d",&n);
a = (int*)malloc(n*sizeof(int)); if(a!=NULL)
{ printf("\nNhap cac phan tu cua mang: "); for(i=0;i<n;i++)
scanf("%d",a+i); }
for(i=0,s=0;i<n;i++) s+=a[i];
printf("\nTong cac phan tu trong mang: %d",s); free(a);
getch(); }
VD15: #include "conio.h” #include "stdio.h“ #include "alloc.h" main()
{ long i,n,m,flag=0; double **a;
printf("Nhap hang matran: "); scanf("%d",&n); printf("\nNhap cot matran: "); scanf("%d",&m); a = (double**)calloc(n,sizeof(double*)); if(a!=NULL) { flag=1; for(i=0;i<n;i++){ a[i] = (double*)malloc(m*sizeof(double)); if(a[i]==NULL){flag=0; break;}} }
if(flag) printf("Success"); else printf("Failure i = %ld",i); n=i; if(a!=NULL){
for(i=0;i<n;i++) if(a[i]!=NULL) free(a[i]); free(a);
}