2009-06-28 38 views
6

Tôi đoán câu hỏi của tôi là liệu sau đây là hợp lệ CMảng Sized Biến trong C

int main(void) { 
    int r = 3; 
    int k[r]; 
    return 0; 
} 

Nếu vậy, sẽ một ai chăm sóc để giải thích lý do tại sao nó không hoạt động trong trình biên dịch C của Microsoft, nhưng trong GCC, và khi nó được thêm vào tiêu chuẩn C.

Cảm ơn bạn

Trả lời

3

Đây là phần mở rộng GCC mà MSVC hiện tại không hỗ trợ. Bạn có thể thay thế nó trong MSVC khá dễ dàng với một _alloca (phân bổ chồng mà không yêu cầu phải deallocation thủ công trên một phần của các lập trình viên):

#include <malloc.h> 

... 

int *k = (int *)_alloca(sizeof(*k)*r); 
+4

Đó là một phần mở rộng GCC, nhưng đã được hệ thống hóa vào C99. MSVC thực sự không hỗ trợ nó. Cũng lưu ý rằng trên Linux, đó là alloca(), không phải là _alloca và nằm trong bdonlan

+2

Nó đã được chuẩn hóa trong 10 năm ... –

+0

Tôi luôn sử dụng tính năng này, nhưng không gặp lỗi cho đến khi tôi sử dụng các cửa sổ làm tôi bối rối – adk

13

Đó là trong C99. MSVC chỉ hỗ trợ C89.

9

C99 standard thêm các mảng có độ dài biến đổi, nhưng các nhà cung cấp khác như GCC đã thêm chúng sớm hơn nhiều.

4

Tôi xin lỗi này không phải là một câu trả lời, nhưng tôi muốn để chỉ ra một vấn đề tiềm tàng với việc sử dụng các mảng có độ dài thay đổi. Hầu hết các mã mà tôi đã đi qua trông như thế này.

void foo(int n) 
{ 
    int bar[n]; 
    . 
    . 
} 

Không có lỗi rõ ràng khi kiểm tra tại đây. Một n lớn có thể dễ dàng gây ra sự cố.

0

Đây là phần mở rộng GCC mà MSVC hiện tại không hỗ trợ. Bạn có thể thay thế nó trong MSVC khá dễ dàng với một _alloca (phân bổ chồng mà không yêu cầu phải deallocation thủ công trên một phần của các lập trình viên)

có nhưng nó được giới hạn trong 1mb