Bài 24 Cấp phát bộ nhớ động

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 61 - 63)

/ *n ếu là dấu cách thì cắt nó kh

Bài 24 Cấp phát bộ nhớ động

Tóm tắt nội dung:

Bộ nhớ được cấp phát động trong C bằng các hàm malloc() và calloc(). Chúng trả về kết quả là địa chỉ đến vùng nhớ đã được cấp phát. Để giải phóng nó ta dùng hàm free().

Thời lượng: 1 tiết

Khai báo một mảng tĩnh có một nhược điểm là số phần tử của mảng là cố định và phải là hằng số. Điều này thường dẫn đến việc thừa hoặc thiếu bộ nhớ cho việc nhập dữ liệu khi chạy chương trình. Thực tế chúng ta cần một mảng dữ liệu mà số phần tử chỉ được xác định được khi chạy chương trình. Người ta gọi mảng như vậy là mảng động (hay còn gọi dữ liệu động). Mảng động phải được cấp phát trên vùng nhớ động (heap) bằng hàm malloc() có khai báo nguyên mẫu trong tệp tiêu đề <alloc.h>.

void *malloc(size_t n);

Kết quả trả về của hàm malloc() là địa chỉ của vùng nhớ có kích thước n bytes được cấp phát theo yêu cầu. Kết quả có thể trả về là NULL khi khơng cịn đủ vùng nhớ trống trên heap để cấp phát. Để sử dụng vùng nhớ đã được cấp phát vào những mục đích nhất định thì ta có thể ép

kiểu con trỏ void* này thành một con trỏ có định kiểu. Ví dụ nếu vùng nhớ cấp phát dùng làm mảng số int thì ta ép kiểu con trỏ bộ nhớ động về int*.

Ví dụ:

int *p, n, i; printf("n = "); scanf("%d", &n);

/* cấp phát mảng động n số int bằng malloc */

p = (int*) malloc(n*sizeof(int)); /* p là con trỏ đến phần tử đầu mảng */ /* khởi tạo giá trị các phần tử = 0 */

for(i=0; i<n; i++) p[i] = 0;

Hàm sizeof(<kiểu dữ liệu>) có khai báo nguyên mẫu trong <stdlib.h> cho phép lấy kích thước của một kiểu dữ liệu. Một bộ nhớ động sau khi sử dụng xong cần phải được giải phóng bằng hàm free(<địa chỉ bộ nhớ động>). Ngồi hàm cấp phát nhớ động malloc() cịn có hai hàm khác cũng có thể được dùng làm nhiệm vụ này:

void *calloc(size_t num, size_t size); void *realloc(void *ptr, size_t n);

Hàm calloc() cho phép cấp phát một vùng nhớ động cho num phần tử, mỗi phần tử có kích thước là size. Còn hàm realloc() dùng để cấp phát lại một vùng nhớ tại địa chỉ ptr với kích thước mới n bytes.

Ví dụ: int *p, n;

/* cấp phát mảng động n số int bằng calloc */ p = (int*) calloc(n, sizeof(int));

Chương trình mẫu (mangdong.c): Dùng bộ nhớ động để nhập n số nguyên và tính giá trị lớn

nhất của chúng. #include <stdio.h> #include <alloc.h> #include <stdlib.h> void main() {

int n, i, max, *a;

printf("n = "); scanf("%d", &n); /* cấp phát bộ nhớ động cho mảng

kích thước cấp phát là n*sizeof(int) */ a = (int*)malloc(n*sizeof(int));

for (i=0; i<n; i++) {

printf("So thu %d: ", i+1); scanf("%d", &a[i]); }

max = a[0];

for (i=1; i<n; i++)

if(max<a[i]) max = a[i]; printf("Max = %d", max);

free(a); }

BÀI TẬP

Câu 1: Một điểm được biểu diễn bằng một cấu trúc thể hiện toạ độ của nó trên màn hình. Viết chương trình cho phép đọc số điểm rồi tạo một mảng có kích thước đủ để lưu toạ độ cho số điểm đó. Tìm và in ra toạ độ hai điểm gần nhau nhất.

Câu 2: Đọc vào hai dãy số nguyên và tạo ra một mảng có kích thước đủ để trộn hai dãy số thành

một dãy số có sắp xếp.

Một phần của tài liệu Bài giảng ngôn ngữ lập trình C (Trang 61 - 63)