13:59
1
A. Stack là một phần bộ nhớ đặc biệt được quản lý một các tự động bởi CPU theo cơ chế FILO(First In, Last Out) dùng để chứa các biến tạm trong quá trình thực hiện các funtion. Mỗi khi ta khai báo một biến trong hàm thì biến đó được đẩy vào stack và khi hàm return thì tất các biến tạm của hàm đó bị xóa vĩnh viễn. Vùng nhớ này tùy thuộc vào loại CPU và OS và nó ngày càng lớn với các thế hệ CPU hiện đại.

B. Heap là một vùng nhớ mà không được CPU quản lý một cách tự động mà lập trình viên phải làm việc này (cấp phát, giải phóng). Trong C có thể cấp phát bằng các hàm như calloc() và malloc(). Nếu heap được cấp phát mà không giải phóng thì phần bộ nhớ đó sẽ không sử dụng được và có thể dẫn đến memory leak( thiếu bộ nhớ). Heap có thể được truy cập bởi bất cứ tiến trình nào. Tốc độ truy cập Heap thấp hơn Stack vì nó còn có cơ chế con trỏ tới ô nhớ đầu tiên và đọc theo kiểu serial.

C. Buffer cũng giống Heap ở chỗ lập trình viên phải tự quản lý nhưng nó chung chung hơn. Nó có kiểu dữ liệu, có thể là một string, mảng byte hay bất cứ gì lập trình viên muốn lưu lại để xử lý sau.

D. Ngôn ngữ C cung cấp cho chúng ta 4 hàm dùng để cấp phát và giải phóng bộ nhớ động, nhằm giải quyết các vấn đề liên quan đến bộ nhớ. Đó là malloc, calloc, reallocfree.
Các hàm này đều nằm trong thư viện stdlib.h
Để biết cách sử dụng các hàm trên ta phải xem nguyên mẫu hàm (prototype) của nó:

1. Trước hết là hàm malloc:
void * malloc ( size_t size ); 
Hàm này dùng để cấp phát bộ nhớ động với kích thước size. 

Ví dụ:
int * bobby;
bobby = (int *) malloc (5 * sizeof(int));
Cái không hay của malloc là các phần tử mới được tạo ra không được khởi gán, mang giá trị bất định!

2. Hàm calloc
void * calloc ( size_t num, size_t size );
Hàm này dùng để cấp phát bộ nhớ động cho một mảng với size_t num là số phần tử của mảng.
Cái hay của calloc còn là ở chỗ các phần tử mới tạo ra sẽ được set to zeros.

Ví dụ:
int * bobby;
bobby = (int *)calloc (5, sizeof(int));

3. Hàm realloc:
void * realloc ( void * ptr, size_t size );
Dùng để thay đổi kích thước bộ nhớ đã cấp phát với ptr là địa chỉ của bộ nhớ đã cấp phát và size là kích thước muốn cấp phát lại (cập nhập) cho vùng nhớ đó.

Ví dụ :
int *pi= malloc(12); // cấp phát 12 bytes cho pi
pi=realloc(pi,14); // tắng bộ nhớ của pi lên 2 bytes

4. Hàm free:
void free ( void * ptr );
Dùng để giải phóng vùng nhớ đã cấp phát.


Chương trình ví dụ sử dụng cấp phát và giải phóng bộ nhớ động.

/* calloc example */
#include <stdio.h>
#include <stdlib.h>

int main ()
{
 int i,n;
 int * pData;
 printf ("Amount of numbers to be entered: ");
 scanf ("%d",&i);
 pData = (int*) calloc (i,sizeof(int));
 if (pData==NULL) exit (1);
 for (n=0;n<i;n++)
 {
 printf ("Enter number #%d: ",n);
 scanf ("%d",&pData[n]);
 }
 printf ("You have entered: ");
 for (n=0;n<i;n++) printf ("%d ",pData[n]);
 free (pData);
 return 0;
}

1 nhận xét: