Cấp phát vùng nhớ cho biến con trỏ:

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 145 - 146)

3. Các phép toán trên biến con trỏ

3.7. Cấp phát vùng nhớ cho biến con trỏ:

Trước khi sử dụng biến con trỏ, ta nên cấp phát vùng nhớ cho biến con trỏ để quản lý địa chỉ. Việc cấp phát được thực hiện nhờ các hàm malloc(), calloc(), realloc() trong thư viện alloc.h. (hay stdlib.h). hoặc cho biến con trỏ trỏ vào địa chỉ của biến tĩnh: p=&a; mục 1.3.1

Khi sử dụng các hàm trên ta phải ép kiểu vì nguyên mẫu các hàm này trả về con trỏ kiểu void nếu cấp phát thành công và trả về NULL nếu cấp phát không thành công.

Hàm malloc(): Hàm thường dùng để cấp phát bộ nhớ động cho biến con

trỏ có kiểu dữ liệu cơ sở, cấu trúc. Lưu ý là vùng nhớ được cấp phát có thể đang lưu giữ giá trị cũ mà chưa bị xóa.

Cú pháp: void *malloc(số ô nhớ cần cấp phát); Ép kiểu:

(Kiểu dữ liệu * ) malloc(số ô nhớ cần cấp phát); Hoặc: void *malloc(n * sizeof(Kiểu dữ liệu);

(Kiểu dữ liệu * ) malloc(n* sizeof(Kiểu dữ liệu);

Ví dụ 11:

int *p;

p=(int*) malloc(20); /*cấp phát vùng nhớ kích thước 20 bytes cho 10 số nguyên */

Hoặc

p = (int*)malloc(sizeof(int)); /* Cấp phát vùng nhớ có kích thước bằng với kích thước của một số nguyên */

p = (int*)malloc(10*sizeof(int)); /*cấp phát vùng nhớ kích thước 20 bytes cho 10 số nguyên */

a. Hàm calloc(): Hàm thường dùng để cấp phát bộ nhớ động cho kiểu dữ

liệu do người dùng tự định nghĩa, ít dùng với kiểu cơ sở. Đặc biệt vùng nhớ động được cấp phát bởi hàm calloc sẽ được set to zeros (đưa về giá trị 0).

144

Cú pháp: void *calloc(n, sizeof(Kiểu dữ liệu); struct sinhvien { char masv[10]; char htsv[30]; … }; sinhvien *q;

/* Cấp phát vùng nhớ có thể chứa được 10 bản ghi sinhvien */

q=(struct sinhvien*)calloc(10, sizeof(struct sinhvien)); b. Hàm realloc(): Được dùng để cấp phát lại bộ nhớ động.

Cú pháp: void *realloc(tên biến con trỏ, số byte mới); int *q;

q = (int*)malloc(sizeof(int));

….

q= (int*)realloc(q, 20); /* Cấp phát vùng nhớ có thể chứa được 10 số nguyên*/

free(q);

Lưu ý:

- Khi cấp phát lại thì nội dung vùng nhớ trước đó vẫn tồn tại. - Kết quả trả về của hàm là địa chỉ đầu tiên của vùng nhớ mới. Địa chỉ này có thể khác với địa chỉ được chỉ ra khi cấp phát ban đầu.

c. Hàm free(): Được dùng để giải phòng vùng nhớ động đã cấp phát, khi

không còn dùng đến nữa.

Cú pháp: void free(void *<biến con trỏ>) Ví dụ: free(q);

Lưu ý: mỗi khi không dùng đến biến động cần phải giải phóng ngay vùng nhớ đã cấp phát.

Một phần của tài liệu Giáo trình cấu trúc dữ liệu và giải thuật (Trang 145 - 146)

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

(186 trang)