Pointer và việc định vị bộ

Một phần của tài liệu POINTER TRONG C - CHƯƠNG 9 pdf (Trang 50 - 55)

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);

}

Một phần của tài liệu POINTER TRONG C - CHƯƠNG 9 pdf (Trang 50 - 55)

Tải bản đầy đủ (PPT)

(70 trang)