2012-06-10 32 views
12

Tôi nhận thấy rằng khi biên dịch với GCC 4.6 sizeof(Foo) là 0 và sizeof(Bar) là 1. Vì lý do nào đó, thêm một mảng trống vào một cấu trúc rỗng có kích thước bằng 0. Tôi nghĩ rằng kích thước của cả hai cấu trúc phải giống nhau . Chuyện gì đang xảy ra ở đây?Zero size struct

struct Foo 
{ 
    char x[]; 
}; 

struct Bar {}; 
+1

Thật kỳ quặc, 'sizeof' không bao giờ có thể là _0 _... –

+0

@ K-ballo: Đối với các mảng linh hoạt như' char x [] 'sizeof là 0. – Tudor

+0

@Tudor: mảng linh hoạt, có phải là phần mở rộng của trình biên dịch không? –

Trả lời

16

Không khai báo struct nào theo tiêu chuẩn C. 6.7.2.1 (8) trong n1570:

If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

Và đoạn 18 trong cùng một phần:

As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.

(tôi nhấn mạnh)

thành viên mảng linh hoạt không được phép trong C++, vì vậy mã không phải là C++ hợp lệ.

Vì nó không phải là mã hợp lệ, các giá trị được báo cáo bởi sizeof cho những điều này là vô nghĩa.

1

Toán tử sizeof không bao giờ mang lại 0, ngay cả đối với một lớp trống.

như bạn có thể nhìn thấy here on msdn

hơn nữa các MSDN được nêu:

Nhà điều hành sizeof không thể được sử dụng với các toán hạng sau:

  • Chức năng. (Tuy nhiên, sizeof có thể được áp dụng cho con trỏ đến các hàm.)
  • Trường bit.
  • Các lớp không xác định.
  • Loại void.
  • mảng được phân bổ động.
  • Mảng bên ngoài.
  • Các loại chưa hoàn tất.
  • Tên được giữ nguyên của các loại không đầy đủ.
1

C và C++ không cho phép các đối tượng có kích thước bằng không.

gcc không hỗ trợ chúng làm tiện ích. Nếu bạn biên dịch với các tùy chọn thích hợp, chẳng hạn như

gcc -std=c99 -pedantic -Wall -Wextra 

gcc ít nhất sẽ cảnh báo bạn về chúng; g ++ có các tùy chọn tương tự.