Chức năng realloc
có thể được sử dụng để tăng hoặc thu nhỏ mảng. Khi mảng phát triển, các mục nhập hiện có giữ lại giá trị của chúng và các mục nhập mới chưa được khởi tạo. Điều này có thể phát triển tại chỗ, hoặc nếu điều đó là không thể, nó có thể cấp phát một khối mới ở nơi khác trong bộ nhớ (và đằng sau hậu trường, sao chép tất cả các giá trị sang khối mới và giải phóng khối cũ).
Các hình thức cơ bản nhất là:
// array initially empty
T *ptr = NULL;
// change the size of the array
ptr = realloc(ptr, new_element_count * sizeof *ptr);
if (ptr == NULL)
{
exit(EXIT_FAILURE);
}
Các nhân là vì realloc
hy vọng một số byte, nhưng bạn luôn muốn mảng của bạn để có đúng số yếu tố. Lưu ý rằng mẫu này cho realloc
có nghĩa là bạn không phải lặp lại T
ở bất kỳ đâu trong mã của bạn ngoài khai báo ban đầu của ptr
.
Nếu bạn muốn chương trình của bạn để có thể phục hồi từ một thất bại phân bổ thay vì làm exit
thì bạn cần phải giữ lại con trỏ cũ thay vì ghi đè lên nó bằng NULL:
T *new = realloc(ptr, new_element_count * sizeof *ptr);
if (new == NULL)
{
// do some error handling; it is still safe to keep using
// ptr with the old element count
}
else
{
ptr = new;
}
Lưu ý rằng thu hẹp một mảng qua realloc
có thể không thực sự trả về bộ nhớ cho hệ điều hành; bộ nhớ có thể tiếp tục được sở hữu bởi quy trình của bạn và có sẵn cho các cuộc gọi trong tương lai tới malloc
hoặc realloc
.
Nguồn
2014-10-06 23:57:48
Vui lòng đăng mã bạn đã viết cho đến thời điểm này. Mọi người thường không thích chỉ viết mã cho bạn. –
Ví dụ: mảng động của các cấu trúc trong C: http://stackoverflow.com/questions/260915/dynamic-array-of-structs-in-c –
Làm thế nào về google hit đầu tiên http://www.cplusplus.com/tham khảo/clibrary/cstdlib/realloc /? Bạn đã cố gắng gì cho đến nay? –