2011-12-24 37 views

Trả lời

9

Cả C và C++ đều không cho phép các mảng có độ dài bằng 0, do đó chương trình của bạn không đúng định dạng.

(Ví dụ: C++ 11, 8.3.4/1: "[kích thước mảng] phải lớn hơn không".)

(Là một trong những điểm lý: Một mảng của zero chiều dài sẽ được khôn lanh và khó hiểu để hòa giải với yêu cầu rằng mỗi đối tượng có một địa chỉ duy nhất.)

Khi @sidyll chỉ ra, các mảng có độ dài không có sẵn là extension trong GCC.

+0

không có lỗi trong trình biên dịch gcc ubuntu 10.04 –

+4

@ user1044137: Có rất nhiều, rất nhiều cách để viết cả chương trình C và C++ không đúng định dạng và bạn không nhận được chẩn đoán. Đối với vấn đề đó, GCC của tôi nói 'cảnh báo: ISO C++ cấm mảng zero-size'. Bạn nên luôn bật tất cả cảnh báo. –

+1

Tại sao bạn soạn một chương trình ** C ** từ câu hỏi ** C ** với trình biên dịch ** C++ ** và đăng đoạn trích chuẩn ** C++ **? – sidyll

3

Bạn sẽ tìm thấy câu trả lời trong The GCC manual

Nếu bạn đang sử dụng c99

  • thành viên mảng linh hoạt được viết như nội dung [] mà không có sự 0.
  • thành viên mảng linh hoạt có đầy đủ loại và do đó toán tử sizeof có thể không được áp dụng. Như một quirk của việc thực hiện ban đầu của các mảng có độ dài bằng không, sizeof đánh giá bằng không.
  • Thành viên mảng linh hoạt chỉ có thể xuất hiện dưới dạng thành viên cuối cùng của cấu trúc không có sản phẩm nào.
  • Cấu trúc chứa thành viên mảng linh hoạt hoặc liên kết có cấu trúc như vậy (có thể đệ quy), có thể không phải là thành viên của cấu trúc hoặc phần tử của mảng. (Tuy nhiên, những công dụng được cho phép bởi GCC như phần mở rộng

và tất nhiên, làm thế nào họ có thể hữu ích:.

mảng Zero-chiều dài được cho phép trong GNU C. Họ rất hữu ích là yếu tố cuối cùng của một cơ cấu mà thực sự là một tiêu đề cho một đối tượng biến dài:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
+1

Trong C11 và C99, 'sizeof' không phải lúc nào cũng là toán tử thời gian biên dịch (chỉ có trong C89). –

1

không có nhiều sử dụng như được đưa ra trong ví dụ của mình, nhưng mảng kích thước zero s đã thường xuyên được sử dụng trong cấu trúc nơi yếu tố cuối cùng đã được tự động kích thước:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [0]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long * s.n_variable_elements; 

Sử dụng một mảng zero chiều dài là:

1) variable_elements có một địa chỉ (dù câu trả lời của một ai đó)
2) nó cũng có ngữ nghĩa mảng
3) tính toán kích thước động của mảng được đơn giản hóa

Thật không may, một số trình biên dịch (MSC) sẽ ném một sự phù hợp hissy trên cấu trúc như vậy và buộc ít hơn, dễ chịu, kỹ thuật không chính xác cải cách:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [1]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1); 

Hãy suy nghĩ về mảng có kích thước bằng không làm trình giữ chỗ. Có rất ít nhu cầu để làm điều đó nữa, trừ khi bạn buộc phải sử dụng C đó là trường hợp trên nhiều môi trường nhúng.

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