2010-05-30 44 views
15

Tôi cần có một loạt các cấu trúc trong trò chơi tôi đang tạo - nhưng tôi không muốn giới hạn mảng thành kích thước cố định. Tôi đã nói có một cách để sử dụng realloc để làm cho mảng lớn hơn khi nó cần, nhưng không thể tìm thấy bất kỳ ví dụ làm việc nào về điều này.Thay đổi kích cỡ mảng bằng C

Có thể ai đó vui lòng chỉ cho tôi cách thực hiện việc này không?

+4

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. –

+0

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 –

+1

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? –

Trả lời

23

Bắt đầu bằng cách tạo ra các mảng:

structName ** sarray = (structName **) malloc(0 * sizeof(structName *)); 

Luôn theo dõi các kích thước riêng:

size_t sarray_len = 0; 

Để tăng hoặc cắt ngắn:

sarray = (structName **) realloc(sarray, (sarray_len + offset) * sizeof(structName *)); 

Sau đó, thiết lập kích thước:

sarray_len += offset; 

hạnh phúc để giúp đỡ và hy vọng rằng sẽ giúp.

+8

Dòng đầu tiên sẽ được cải thiện nhiều bằng cách viết 'structName ** sarray = NULL;'. Nó được định nghĩa rõ ràng để sử dụng 'realloc' với một con trỏ null. –

+1

Lưu ý rằng 'malloc (0)' đã thực hiện các kết quả xác định; nó có thể trả về NULL hoặc một con trỏ hợp lệ mà không bao giờ có thể được dereferenced (nhưng có thể được chuyển đến 'free()' hoặc 'realloc()'). –

+0

Nitpicking: Điều này không quản lý một mảng * * của struct * "mà là một mảng con trỏ tới cấu trúc. – alk

6

Từ http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

/* realloc example: rememb-o-matic */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int input,n; 
    int count=0; 
    int * numbers = NULL; 

    do { 
    printf ("Enter an integer value (0 to end): "); 
    scanf ("%d", &input); 
    count++; 
    numbers = (int*) realloc (numbers, count * sizeof(int)); 
    if (numbers==NULL) 
     { puts ("Error (re)allocating memory"); exit (1); } 
    numbers[count-1]=input; 
    } while (input!=0); 

    printf ("Numbers entered: "); 
    for (n=0;n<count;n++) printf ("%d ",numbers[n]); 
    free (numbers); 

    return 0; 
} 
+2

Bad Pavel! Không đăng mã của người khác! Không có cookie! :) –

+10

Tôi đã tham khảo, làm cho nó thành một cookie, phải không? –

8

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.

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