2012-10-27 36 views
6

Mã này có nghĩa là gì?Điều gì sẽ xảy ra khi có một phần khởi tạo của một mảng cấu trúc trong C?

struct foo_t { 
    int a; 
    int b; 
} foo[10] = {{0,0}} 

foo [0] là {0,0}, còn phần còn lại thì sao? Tiêu chuẩn C xử lý việc này như thế nào?

THÊM. Tôi đã thành lập một câu trả lời đầy đủ here. Tôi nghĩ câu hỏi của tôi sẽ bị xóa.

+0

thể trùng lặp của [C và C++: khởi tạo một phần của cấu trúc tự động] (http://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure) –

Trả lời

8

Toàn bộ mảng sẽ được khởi tạo với cấu trúc có giá trị 0 cho cả hai ab. Điều này tương tự trường hợp sau đây với một giá trị nguyên thủy:

int foo[10] = {0}; 

đâu mỗi số nguyên trong mảng sẽ được khởi tạo với giá trị 0.

chuẩn

Các C99 quy định cụ thể như sau:

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ả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ẽ là được khởi tạo hoàn toàn giống với các đối tượng có thời lượng lưu trữ tĩnh.

+1

+1 để trích dẫn std. –

2

Giá trị bằng 0 thường có nghĩa là kết thúc danh sách. Bởi điều này tôi có nghĩa là khi bạn lặp lại một danh sách như vậy và bạn gặp phải đồ chơi giá trị này biết rằng bạn đã đạt đến đích. Tôi cho rằng bất cứ ai tạo ra quảng cáo này một cái gì đó như thế này trong tâm trí của mình. Nếu bạn tìm kiếm thông qua mã, bạn có thể tìm thấy một đoạn mã đặt giá trị bằng không sau khi gắn thêm một giá trị trong danh sách.

+0

Xin lỗi cho tiếng Anh của tôi. Nhưng ý tôi là * cấu trúc sẽ được khởi tạo như thế nào *. Tôi rất thú vị về ngôn ngữ, chứ không phải cách tác giả muốn sử dụng mã ở trên. Tôi hơi chỉnh sửa câu hỏi của mình. –

+0

Ok đây rồi. Một mảng như thế này dự trữ một khối bộ nhớ trong vùng dữ liệu của chương trình. Trình biên dịch trong thời gian biên dịch khởi tạo bộ nhớ này với 0s. Nếu nó là một biến cục bộ, khối toàn cầu được sao chép vào ngăn xếp để khởi tạo nó. Hãy nhớ rằng mảng cấu trúc này chiếm một khối bộ nhớ liên tiếp, do đó, bằng cách thiết lập tất cả các byte thành 0, bạn thực sự khởi tạo mảng. Tôi hy vọng tôi đã trả lời câu hỏi của bạn. – Gus

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