C Phân bổ lại bộ nhớ
Phân bổ lại bộ nhớ
Nếu dung lượng bộ nhớ bạn dành riêng không đủ, bạn có thể phân bổ lại bộ nhớ để tăng dung lượng.
Phân bổ lại dự trữ một lượng bộ nhớ khác (thường lớn hơn) trong khi vẫn giữ dữ liệu được lưu trữ trong đó.
Bạn có thể thay đổi kích thước bộ nhớ được phân bổ bằng hàm realloc()
.
Hàm realloc()
có hai tham số:
int *ptr2 = realloc( ptr1 , size );
- Tham số đầu tiên là một con trỏ tới bộ nhớ đang được thay đổi kích thước.
- Tham số thứ hai chỉ định kích thước mới của bộ nhớ được phân bổ, được đo bằng byte.
Hàm realloc()
cố gắng thay đổi kích thước bộ nhớ tại ptr1 và trả về cùng một địa chỉ bộ nhớ. Nếu nó không thể thay đổi kích thước bộ nhớ tại địa chỉ hiện tại thì nó sẽ cấp phát bộ nhớ ở một địa chỉ khác và trả về địa chỉ mới thay thế.
Lưu ý: Khi realloc()
trả về một địa chỉ bộ nhớ khác, bộ nhớ tại địa chỉ ban đầu không còn được bảo lưu và không an toàn khi sử dụng. Khi việc phân bổ lại hoàn tất, tốt nhất là gán con trỏ mới cho biến trước đó để con trỏ cũ không thể vô tình được sử dụng.
Ví dụ
Tăng kích thước bộ nhớ được phân bổ:
int *ptr1, *ptr2, size;
// Allocate memory for four integers
size =
4 * sizeof(*ptr1);
ptr1 = malloc(size);
printf("%d bytes allocated
at address %p \n", size, ptr1);
// Resize the memory to hold six
integers
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);
printf("%d bytes reallocated at address %p \n", size, ptr2);
Hãy tự mình thử »Kiểm tra con trỏ và lỗi NULL
Hàm realloc()
trả về một con trỏ NULL
nếu nó không thể cấp phát thêm bộ nhớ. Điều này rất khó xảy ra nhưng cần lưu ý khi bạn cần mã của mình không bị lỗi.
Ví dụ sau đây kiểm tra xem realloc()
có thể thay đổi kích thước bộ nhớ hay không bằng cách kiểm tra con trỏ NULL
:
Ví dụ
Kiểm tra con trỏ NULL:
int *ptr1, *ptr2;
// Allocate memory
ptr1 = malloc(4);
//
Attempt to resize the memory
ptr2 = realloc(ptr1, 8);
// Check
whether realloc is able to resize the memory or not
if ( ptr2 ==
NULL ) {
// If reallocation fails
printf("Failed. Unable to resize memory");
} else {
// If reallocation is sucessful
printf("Success. 8 bytes reallocated at address %p \n", ptr2);
ptr1 = ptr2;
// Update ptr1 to point to the newly allocated memory
}
Hãy tự mình thử »Lưu ý: Bạn phải luôn bao gồm việc kiểm tra lỗi (nếu con trỏ == NULL) khi cấp phát bộ nhớ.
Lưu ý: Bạn cũng phải luôn giải phóng hoặc giải phóng bộ nhớ được phân bổ khi sử dụng xong. Điều này rất quan trọng để đảm bảo rằng chương trình của bạn hoạt động như mong đợi nhưng cũng sẽ giúp chương trình dễ bảo trì và hiệu quả hơn.
Để giải phóng bộ nhớ, chỉ cần sử dụng hàm free()
:
Bạn sẽ tìm hiểu thêm về cách giải phóng bộ nhớ được phân bổ và tại sao điều này lại quan trọng trong chương tiếp theo.