2016-11-14 16 views
23

Trong mã C tôi đang phân tích, có rất nhiều mảng đa chiều được khởi tạo với một số dấu ngoặc nhọn khác nhau, ví dụ: {{0}} hoặc {{{0}}}.Khởi tạo một mảng đa chiều: {0} so với {{{0}}}

Tuy nhiên, thay thế chúng bằng {0} cũng hoạt động hoàn hảo.

Có sự khác biệt (chức năng) nào giữa việc sử dụng một hoặc nhiều tập hợp dấu ngoặc nhọn ({}) xảy ra không?

+4

[Khởi tạo toàn bộ mảng 2D với một giá trị] (http://stackoverflow.com/questions/15520880/initializing-entire-2d-array-with-one-value) nên trả lời tại sao '{0}' hoạt động. – Lundin

Trả lời

13

Không, không có sự khác biệt về chức năng. Tiêu chuẩn C cho phép rời khỏi trung gian {}. Cụ thể, biểu mẫu { 0 } là bộ khởi tạo có thể được sử dụng cho tất cả các loại dữ liệu.

8

Bạn có hai lựa chọn: { 0 }, hoạt động cho bất kỳ loại tổng hợp hoặc liên kết nào và không khởi tạo mọi thành viên hoặc sử dụng đúng biểu mẫu phải tương ứng với tất cả thành viên một cách chính xác.

+4

No. '{0}' hoạt động ngay cả đối với các loại vô hướng. Không có sự khác biệt giữa '{0}' và '{{{0}}}'. –

+1

Bạn đã nói "làm việc cho bất kỳ loại tổng hợp hoặc liên kết nào". Nó không hàm ý như vậy? –

+3

@ P.P. '{0}' làm việc cho các loại vô hướng, nhưng tôi không bao giờ nói nó không. – 2501

3

Chỉ cần nhắc lại những gì Jens đã nói, {0} hoạt động đối với mọi loại. Nó là "bộ khởi tạo không phổ dụng" trong C. Xem bản nháp C11, 6.7.9 Initialization.

Vì vậy, để khởi tạo một mảng 3D, {0} hoặc {{{0}}} có thể được sử dụng. Cá nhân tôi muốn sử dụng {0} vì nó dễ dàng hơn để nhập và đọc và hoạt động cho mọi loại. Điều đó có nghĩa, các đều khởi tạo giá trị sau:

int main(void) 
{ 
    int x = {0,}; 
    int *p = {0,}; 
    int *q = {0}; 
    int arr[3][3][3][3] = {0}; 
} 

Quan trọng hơn, nếu bạn tình cờ có một số chưa biết/loại đục, ví dụ từ một thư viện của bên thứ ba, sau đó chỉ cách cầm tay để khởi tạo chúng là sử dụng {0}. Bất kỳ cách nào khác để không sử dụng nó (chẳng hạn như sử dụng memset() hoặc trực tiếp some_type_t state = 0;) sẽ yêu cầu một số kiến ​​thức nội bộ về loại có liên quan và rủi ro không phải là di động.

+3

Nếu bạn có loại mờ từ thư viện khác, bạn không nên can thiệp vào nội bộ của nó ở nơi đầu tiên, nhưng hãy để thư viện đó khởi tạo nó. – Lundin

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