2012-09-11 38 views
7

Có cách nào (khác với malloc) để tạo mảng có kích thước mà người dùng nhập không?Có cách nào tạo một mảng với độ dài biến đổi trong c?

+2

Bạn cần một trình biên dịch hỗ trợ nó và các tùy chọn phù hợp được bật. Nhưng hãy lưu ý đến những hạn chế của VLAs trước khi bạn làm điều đó. – Mysticial

+9

Tại sao bạn không muốn sử dụng 'malloc()'? –

+0

tôi muốn biết nếu có cách nào khác để làm như vậy. – rippy

Trả lời

2

Một cách là sử dụng VLA (C99 định nghĩa cái được gọi là 'Mảng độ dài biến').

Dưới đây là một ví dụ:

#include <stdio.h> 

int use_a_vla (int n) 
{ 
    int vla[n]; /* Array length is derived from function argument. */ 

    vla[0] = 10; 
    vla[n-1] = 10; 

    return 0; 
} 

int main (void) 
{ 
    int i; 

    scanf ("%d", &i); /* User input. */ 

    use_a_vla (i); 
} 
6

Tất cả phụ thuộc vào trình biên dịch.

Variable-length mảng tự động được cho phép trong ISO C99, và như một phần mở rộng GCC chấp nhận chúng trong chế độ C90 và trong C++. Những mảng được khai báo giống như bất kỳ mảng tự động nào khác, nhưng với độ dài không phải là một biểu thức liên tục. Việc lưu trữ được phân bổ tại điểm khai báo và deallocated khi cấp độ brace được thoát. Đối với dụ:

FILE * 
concat_fopen (char *s1, char *s2, char *mode) 
{ 
    char str[strlen (s1) + strlen (s2) + 1]; 
    strcpy (str, s1); 
    strcat (str, s2); 
    return fopen (str, mode); 
} 

Xem this để biết thêm thông tin.

0

Vâng, đây là một phần nhỏ, nhưng bạn có thể viết mã quản lý vùng heap của riêng mình và gọi hàm phân bổ bộ nhớ của bạn ngoài cái gì đó hơn malloc(). Tôi hy vọng câu trả lời này là thú vị hơn là gây phiền nhiễu.

1

Nếu bạn không có Vlas hoặc alloca(), đây là một cực kỳ kludgy, nhưng di động, ngăn xếp dựa trên kỹ thuật:

int foo(int size) 
{ 
    if (size <= 64*1024) 
    { 
     unsigned char arr[64*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 1*1024*1024) 
    { 
     unsigned char arr[1*1024*1024]; 
     return bar(arr, size); 
    } 
    else if (size <= 64*1024*1024) 
    { 
     unsigned char arr[64*1024*1024]; 
     return bar(arr, size); 
    } 
    else 
     return -1;  // Assume it's too big 
} 

int bar(unsigned char arr[], int size) 
{ 
    ...your code goes here... 
} 

int maincode(int size) 
{ 
    // Invoke bar() indirectly, allocating an array 
    // on the stack of at least 'size' bytes 
    return foo(size); 
} 

Tôi không đặc biệt khuyên kỹ thuật này, nhưng nó sẽ cung cấp cho bạn cách khác nhau khối kích thước bộ nhớ được phân bổ trên ngăn xếp thay vì đống.

0

Tôi cho rằng bạn đang cố tránh malloc vì bạn không biết về realloc.

Về cơ bản, bạn nên cố gắng thực hiện những gì vector C++ thực hiện. Khi mảng của bạn phát triển đến một kích thước nhất định, realloc sẽ tăng gấp đôi kích thước của nó.

realloc sẽ phát triển khối bộ nhớ của bạn nếu có thể và nếu không, nó sẽ malloc hình mới và sao chép nội dung.

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