Bài giảng Kỹ thuật lập trình - Bài 4: Cấp phát động - Lê Gia Minh

ppt 16 trang hoanguyen 3410
Bạn đang xem tài liệu "Bài giảng Kỹ thuật lập trình - Bài 4: Cấp phát động - Lê Gia Minh", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pptbai_giang_ky_thuat_lap_trinh_bai_4_cap_phat_dong.ppt

Nội dung text: Bài giảng Kỹ thuật lập trình - Bài 4: Cấp phát động - Lê Gia Minh

  1. Kỹ thuật lập trình Cấp phát động 1
  2. Nội dung ¡ Mảng nhiều chiều ¡ Cấp phát động l Malloc l Calloc l Realloc l free ¡ Cấp phát động mảng một chiều và 2 chiều. 2
  3. Mảng nhiều chiều ¡ Khai báo : ¡ Kieu ten[hang][cot] ; ¡ int a[10][20] ; ¡ Nếu khai báo a là mảng 2 chiều thì phải khai : l int Input ( int a[][20]) l int Input (int (*a)[20]) ¡ Thí dụ : a[3][9] = 1; phải tính ra địa chỉ là : a+3*20+9 ->( a+69) 3
  4. Mảng nhiều chiều (tt) ¡ Khi khai báo : int a[10][20] ->a[5] sẽ là mảng có 20 phần tử kiểu int ¡ a[i]  với &a[i][0] ; ¡ Khởi động : l int a[2][3] = { { 1,2,3 } , {6,7,8} }; 4
  5. Cấp phát động ¡ Cấp phát một vùng nhớ khi cần thiết trong vùng Heap ¡ Trả lại (giải phóng) cho hệ điều hành khi không cần dùng nửa. ¡ Tiết kiệm bộ nhớ. ¡ Người lập trình phải viết code cho việc xin và giải phóng. 5
  6. Hàm malloc (stdlib.h) ¡ Cú pháp : l void* malloc(size_t Size) l size_t : như kiễu unsigned int ¡ Giá trị trả về : l NULL nếu không đủ bộ nhớ để cấp. l Trả về con trỏ đến vùng nhớ được cấp nếu cấp thành công l Nếu Size = 0 , hàm trả về NULL 6
  7. Thí dụ (malloc) int *a , N ; printf(“Nhap so phan tu : “); scanf(“%d” , &N); a = (int*)malloc(N*sizeof(int)); if (a==NULL) printf(“Khong du vung nho de cap ”); else for(i = 0 ; i<N ; i++) a[i] = i; 7
  8. Hàm free() ¡ Mục đích: l Giải phóng vùng nhớ, trả khối nhớ được cấp phát động cho hệ điều hành ¡ Cú pháp : l void free(void* ptr) l Giải phóng vùng nhớ đã cấp cho con trỏ ptr trước đó bằng một trong các hàm : malloc , calloc , realloc. 8
  9. Thí dụ : free void main() { char * st = (char*)malloc(10); if (st!=NULL) { gets(st); puts(st); free(st); } else printf(“Khong du bo nho hay co loi ”); } 9
  10. Hàm calloc ¡ Mục đích : l Như malloc nhưng các giá trị trong mảng sẽ được khởi tạo giá trị là 0. ¡ Khai báo : l void* calloc(size_t nitems,size_t size) l Khởi tạo một mảng có nitems phần tử, mỗi phần tử chiếm size bytes. l Trả về NULL nếu cấp không thành công, và trả về con trỏ đến đầu khối nhớ nếu cấp được. 10
  11. Calloc (thí dụ) void main() { int N , *Arr , i ; printf(“Nhap so phan tu : “); scanf(“%d” , &N); Arr = (int*)calloc(N, sizeof(int)); if (Arr!=NULL) { for(i=0 ; i<N ; i++) Arr[i]=i; ; free(Arr); } else printf(“Khong du bo nho hay co loi ”); } 11
  12. Realloc ¡ Mục đích : l Cấp phát lại khối nhớ với một kích thước lớn hơn mà vẫn giữ được các giá trị đã nhập vào mảng trước đó. ¡ Khai báo : l void* realloc(void* oldBlock , size_t newsize) l Cấp một khối nhớ newsize bytes , copy nội dung củ trong oldBlock vào khối nhớ mới. l Trả về NULL nếu cấp thất bại. 12
  13. Realloc(thí dụ) void main() { int N , *Arr , i ; Arr = (int*)malloc(10*sizeof(int)); printf(“Nhap so phan tu moi : “); scanf(“%d” , &N); Arr = (int*)realloc(Arr, N*sizeof(int)); if (Arr!=NULL) { for(i=0 ; i<N ; i++) Arr[i]=i; ; free(Arr); } else printf(“Khong du bo nho hay co loi ”); } 13
  14. Cấp phát động cho mảng 2 chiều 14
  15. Giải phóng mảng động 2 chiều ¡ Phải giải phóng theo chiều ngược lại ¡ Sau đó mới giải phóng theo hàng for (j=0 ; j<dong ; j++) free(A[j]); free(A); 15
  16. Bài tập ¡ Viết chương trình cộng trừ hai ma trận số nguyên. 16