2010-04-30 36 views
16

Tôi là một chút mới đối với malloc và C nói chung. Tôi muốn biết làm thế nào tôi có thể, nếu cần thiết, mở rộng kích thước của một mảng có kích thước cố định khác với malloc.C: Mở rộng một mảng với malloc

Ví dụ:

#define SIZE 1000 
struct mystruct 
{ 
    int a; 
    int b; 
    char c; 
}; 
mystruct myarray[ SIZE ]; 
int myarrayMaxSize = SIZE; 
.... 
if (i > myarrayMaxSize) 
{ 
    // malloc another SIZE (1000) elements 
    myarrayMaxSize += SIZE; 
} 
  • Ví dụ trên nên nói rõ những gì tôi muốn đạt được.

(Bằng cách này: Tôi cần điều này cho một thông dịch viên tôi viết: Làm việc với một số tiền cố định của các biến và trong trường hợp nhiều hơn là cần thiết, chỉ cần phân bổ cho họ động)

Trả lời

15

Sử dụng realloc, nhưng bạn phải phân bổ mảng với malloc đầu tiên. Bạn đang phân bổ nó trên ngăn xếp trong ví dụ trên.

size_t myarray_size = 1000; 
    mystruct* myarray = malloc(myarray_size * sizeof(mystruct)); 

    myarray_size += 1000; 
    mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct)); 
    if (myrealloced_array) { 
    myarray = myrealloced_array; 
    } else { 
    // deal with realloc failing because memory could not be allocated. 
    } 
+5

'x = realloc (x, newsize)' là rò rỉ bộ nhớ đang chờ xảy ra. –

+0

Điểm tốt. Tôi đã cập nhật mã ví dụ để xử lý các lỗi thất bại. –

+0

'myarray = myrealloced_array)' nên là 'myarray = myrealloced_array;' :) – Saul

6

Không, bạn không thể. Bạn không thể thay đổi kích thước của một mảng trên ngăn xếp khi nó được xác định: đó là loại kích thước cố định có nghĩa là gì. Hoặc một mảng toàn cầu, hoặc: nó không rõ ràng từ mẫu mã của bạn, nơi myarray được xác định.

Bạn có thể malloc mảng 1000 phần tử và sau đó đổi kích thước nó bằng realloc. Điều này có thể trả về cho bạn một mảng mới, có chứa một bản sao của dữ liệu từ một mảng cũ, nhưng có thêm không gian ở cuối.

1

a) bạn không sử dụng malloc để tạo nó để bạn không thể mở rộng bằng malloc. Làm:

mystruct *myarray = (mystruct*)malloc(sizeof(mystruct) *SIZE); 

b) sử dụng realloc (RTM) để làm cho nó lớn hơn

+1

RTM -> http://www.cplusplus.com/reference/cstdlib/realloc/ – Mawg

12

Bạn muốn sử dụng realloc (như áp phích khác đã chỉ ra). Nhưng thật không may, các áp phích khác đã không được hiển thị bạn làm thế nào để sử dụng một cách chính xác nó:

POINTER *tmp_ptr = realloc(orig_ptr, new_size); 
if (tmp_ptr == NULL) 
{ 
    // realloc failed, orig_ptr still valid so you can clean up 
} 
else 
{ 
    // Only overwrite orig_ptr once you know the call was successful 
    orig_ptr = tmp_ptr; 
} 

Bạn cần phải sử dụng tmp_ptr để nếu realloc thất bại, bạn sẽ không bị mất con trỏ gốc.

Các vấn đề liên quan