Cấp phát động trong C .

Bài viết tham khảo của bạn ngocbig, nguồn:
http://www.ddth.com/showthread.php/223415-hàm-cấp-phát-động-trong-borland-C-forDOS

Ngôn ngữ c dùng có bốn hàm liên quan đến cấp phát động, cụ thể là:

– malloc
– calloc
– realloc
– free

1. Hàm malloc có nguyên mẫu:
void* malloc(size_t size);
Trong đó size là số byte bộ nhớ cần cấp phát, giá trị trả về là địa chỉ của bộ nhớ vừa cấp phát.
2. Hàm calloc có nguyên mẫu:
void* calloc(size_t nitem, size_t size);
Trong đó nitem là số phần tử (ví dụ trong một mảng, hoặc chuỗi), size là kích thước (số byte) của từng phần tử đó), giá trị trả về như của malloc.
3. Hàm realloc dùng để thay đổi kích thước bộ nhớ đã được cấp phát, có nguyên mẫu:
void* realloc(void* block, size_t size);
Trong đó block là địa của bộ nhớ đã cấp phát trước đó, size là tổng số byte bộ nhớ bạn muốn cấp phát lại, giá trị trả về là địa chỉ của bộ nhớ được cấp phát lại.
4. Hàm free. Dùng để giải phóng vùng bộ nhớ được cấp phát bởi 1 trong 3 hàm trên. Nguyên mẫu:
void free(void* block);
Trong đó block là địa chỉ của vùng bộ nhớ cần giải phóng.

Các hàm trên được khai báo trong tệp tiêu đề stdlib.h
—————————————–
Ví dụ:
Giả sử bạn muốn cấp phát một mảng số nguyên gồm n=10 phần tử.
– Dùng malloc:
int n=10;
int* my_array = (int*)malloc(n*sizeof(int));
– Dùng calloc:
int* my_array = (int*)calloc(n,sizeof(int));
– Dùng realloc để thay đổi kích thước cho vùng bộ nhớ trước:
int* my_array_new_size = (int*)realloc(my_array,20);
– Dùng free:
free(my_array);
———————
Vì sao phải dùng đến cấp phát động?

Giả sử khi bạn muốn khai báo một mảng int gồm n phần tử, số phần tử này chỉ được biết khi chương trình chạy (ví dụ như khi yêu cầu người sử dụng nhập số lượng phần tử cho mảng).Bạn sẽ code như sau:

int n;
printf(“n=”);
scanf(“%d”,&n);
int my_array[n];
….
Khi bạn biên dịch sẽ có thông báo lỗi bởi vì n không thể là biến mà phải là một hằng. Bản phải điền một giá trị cho số phần tử của mảng hoặc phải định nghĩa n là một hằng (#define n…). Nhưng yêu cầu của bài là số phần tử được xác định khi chạy. Do đó phải dùng đến hàm cấp phát động cho mảng.

int n;
printf(“n=”);
scanf(“%d”,&n);
int* my_array = (int*)malloc(n*sizeof(int));// cấp phát động

free(my_array);

//===================end===============

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s