2010-07-30 32 views
13

Trong C99 (và không có trong C++), nó có thể khởi tạo cấu trúc sử dụng cú pháp sau:Điều gì sẽ xảy ra với các trường không được đặt tên bởi trình khởi tạo được chỉ định?

struct info 
{ 
    char name[8+1]; 
    int  sz; 
    int  typ; 
}; 

struct info arr[] = 
{ 
    [0] = { .sz = 20, .name = "abc" }, 
    [9] = { .sz = -1, .name = "" } 
}; 

gì xảy ra với các lĩnh vực không xác định?

+2

Tôi chắc chắn rằng chúng được khởi tạo 0. Nhưng tôi cũng chắc chắn rằng một người khác sẽ nhanh hơn để tìm phần của thông số C99 mà làm cho nó như vậy. ... Và tôi đã đúng! – torak

Trả lời

23

Chúng bị xóa. Từ tiêu chuẩn C99 § 6.7.8 (Khởi)/21,

Nếu có ít initializers trong một danh sách cú đúp kín hơn có những yếu tố hoặc thành viên của một tổng hợp, hoặc các ký tự ít trong một chuỗi chữ sử dụng để khởi tạo một mảng có kích thước đã biết hơn có các phần tử trong mảng, phần còn lại của tổng hợp sẽ được khởi tạo hoàn toàn giống như các đối tượng có thời gian lưu trữ tĩnh.

+0

Chính xác những gì tôi muốn biết, hoàn chỉnh với báo giá chuẩn. Cảm ơn! –

+3

@Matt Joiner: Có bất kỳ nghi ngờ nào không? Oh, và cho đầy đủ xem §6.7.8 (khởi tạo)/10, trong đó có hiệu quả nói rằng lưu trữ tĩnh như vậy là NULL/0 khởi tạo. – torak

+2

Một hệ quả hữu ích của thực tế này là '{0}' là một bộ khởi tạo số không phổ quát có thể được sử dụng cho bất kỳ loại tổng hợp nào (và thực sự là bất kỳ loại nào, IIRC), mặc dù một số trình biên dịch có thể đưa ra cảnh báo nếu nó được sử dụng cho các loại đơn giản). –

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