2009-03-15 37 views
8

tôi về cơ bản muốn C tương đương này (tốt, chỉ là một phần với mảng, tôi không cần lớp và chuỗi phân tích cú pháp và tất cả những gì):Làm thế nào để khai báo kích thước của một mảng tại thời gian chạy trong C?

public class Example 
{ 
    static int[] foo; 
    public static void main(String[] args) 
    { 
     int size = Integer.parseInt(args[0]); 
     foo = new int[size]; // This part 
    } 
} 

Pardon C sự thiếu hiểu biết của tôi. Tôi đã bị hỏng bởi java;)

+0

Có vẻ như bạn đã bị hỏng bởi C++;) – gbarry

Trả lời

11
/* We include the following to get the prototypes for: 
* malloc -- allocates memory on the freestore 
* free -- releases memory allocated via above 
* atoi -- convert a C-style string to an integer 
* strtoul -- is strongly suggested though as a replacement 
*/ 
#include <stdlib.h> 
static int *foo; 
int main(int argc, char *argv[]) { 
    size_t size = atoi(argv[ 1 ]); /*argv[ 0 ] is the executable's name */ 
    foo = malloc(size * sizeof *foo); /* create an array of size `size` */ 
    if (foo) { /* allocation succeeded */ 
     /* do something with foo */ 
     free(foo); /* release the memory */ 
    } 
    return 0; 
} 

Lưu ý: Tắt công cụ quấn, không kiểm tra lỗi.

+0

Bạn nên đề cập rằng "if (foo) miễn phí (foo)); " là "bộ sưu tập rác". – Joel

+0

Không có bộ sưu tập rác trong C. Tôi muốn nói dối ;-) Nhưng tôi đã đưa vào một số ý kiến. – dirkgently

+0

Tôi không nghĩ rằng foo nên được khai báo tĩnh, ý nghĩa là khác nhau với java. Ở đây chúng tôi chỉ muốn một biến toàn cục. – Ben

5

Trong C, bạn có thể làm điều đó với điều này, nếu bạn bỏ qua việc kiểm tra lỗi:

#include <stdlib.h> 
static int *foo; 

int main(int argc, char **argv) 
{ 
    int size = atoi(argv[1]); 
    foo = malloc(size * sizeof(*foo)); 
    ... 
} 

Nếu bạn không muốn có một biến toàn cầu và bạn đang sử dụng C99, bạn có thể làm:

int main(int argc, char **argv) 
{ 
    int size = atoi(argv[1]); 
    int foo[size]; 
    ... 
} 

Điều này sử dụng một mảng độ dài biến thiên VLA.

0
int count = getHowManyINeed(); 
int *foo = malloc(count * sizeof(int)); 
2

Nếu bạn cần để khởi tạo dữ liệu, bạn có thể sử dụng calloc:

int* arr = calloc (nb_elems, sizeof(int)); 
/* Do something with your array, then don't forget to release the memory */ 
free (arr); 

Bằng cách này, bộ nhớ phân bổ sẽ được khởi tạo với zero, mà có thể hữu ích. Lưu ý rằng bạn có thể sử dụng bất kỳ loại dữ liệu nào thay vì int.

1

Thật không may, nhiều câu trả lời cho câu hỏi này, bao gồm câu trả lời là đúng nhưng không tương đương với đoạn mã OP của. Hãy nhớ rằng operator new[] gọi hàm tạo mặc định cho mọi phần tử mảng. Đối với các loại POD như int không có hàm tạo, chúng được khởi tạo mặc định (đọc: zero-initialized, xem §8.5 ¶5-7 của The C++ Standard).

tôi chỉ trao đổi malloc (cấp phát bộ nhớ chưa được khởi tạo) cho calloc (cấp phát bộ nhớ zeroed), do đó tương đương với ++ đoạn C nhất định sẽ được

#include <stdlib.h> /* atoi, calloc, free */ 

int main(int argc, char *argv[]) { 
    size_t size = atoi(argv[1]); 
    int *foo; 

    /* allocate zeroed(!) memory for our array */ 
    foo = calloc(sizeof(*foo), size); 
    if (foo) { 
     /* do something with foo */ 

     free(foo); /* release the memory */ 
    } 

    return 0; 
} 

Xin lỗi vì làm sống lại câu hỏi cũ này nhưng nó chỉ không cảm thấy quyền rời đi mà không có một bình luận (mà tôi không có đại diện yêu cầu) ;-)

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