2009-12-08 28 views
8

tại sao chúng ta có thể làm điều này trong c?tại sao [n] được chấp nhận trong c trong suốt thời gian chạy?

int n; 
scanf("%d",&n); 
int a[n]; 

Tôi nghĩ mảng nằm trong bộ nhớ trong thời gian tải nhưng có vẻ như ví dụ trên hoạt động trong thời gian chạy. Tôi có hiểu lầm điều gì không? các bạn có thể giúp gì không?

Cảm ơn,

+0

Nó cũng được cung cấp như một phần mở rộng của g ++ mặc dù VLA không phải là một phần của C++ (nhưng sẽ là một phần của C++ 0x). –

+0

Phần mở rộng C++ không bao gồm hỗ trợ cho các tham chiếu đến một loại mảng có độ dài thay đổi; không thể tham số hàm là tham chiếu đến kiểu mảng biến độ dài (IBM C++) –

+2

Không, nó sẽ không là một phần của C++ 0x. –

Trả lời

6

I thought array is *al*located memory during load time but seems like the above example works during run-time.

Vâng, bình thường các mảng như <datatype> <Array_Name> [<size>] được cấp phát bộ nhớ trong thời gian tải nó có trong C89 và cũng tồn tại trong C99.

Nhưng trong đoạn mã int a[n]; là một mảng chiều dài biến đổi hoặc VLA cho ngắn.

Một bài báo đàng hoàng về sự cần thiết của Vlas có thể được tìm thấy ở đây: http://www.ddj.com/cpp/184401444 :)

9

Tôi không có chuyên môn trong C, nhưng điều này có thể là một variable-length array như bổ sung bởi C99supported by GCC, ví dụ. GCC cấp phát bộ nhớ cho mảng đó trên stack, để nó được tự động giải phóng khi bạn quay trở lại từ hàm.

+0

Đây là VLA (tính năng C99), tại sao bạn không chắc chắn? –

+0

Tôi nói rằng tôi không phải là chuyên gia về C, bởi vì mặc dù tôi biết có những thứ như VLA, tôi chưa bao giờ sử dụng chúng và tôi không chắc chắn 100% đây là những gì mà người đăng tải đang nói đến. – zoul

0

Cho biết mã của bạn được viết như thế nào (cụ thể là bạn có tuyên bố), đây phải là mã trong một hàm.

Mặc dù tôi không chắc liệu điều này có được yêu cầu nghiêm ngặt trong thông số kỹ thuật hay không, trong một hàm, tất cả các mảng tự động (tức là cấp chức năng, không tĩnh) được đặt trên ngăn xếp. Vì vậy, bất kể bạn có một mảng thông thường hay VL, bộ nhớ được cấp phát khi chạy.

Bộ nhớ cho mảng không tự động không được xử lý khi chạy nên không hỗ trợ VLA. lỗi

extern int size; 
char buff1[size]; 

void doit(int x) 
{ 
    static int buff2[x]; 
    int buff3[x]; 
} 

Trên biên dịch Tôi đã thử nghiệm này trên (gcc 4.2.1), tôi đã sau:: Nếu bạn cố gắng để biên dịch đoạn mã sau

moo.c:2: error: variably modified ‘buff1’ at file scope 
moo.c: In function ‘doit’: 
moo.c:6: error: storage size of ‘buff2’ isn’t constant 
Các vấn đề liên quan