2012-11-06 62 views
32

Tôi có câu hỏi về việc khởi tạo biến tĩnh trong C. Tôi biết nếu chúng ta khai báo biến tĩnh toàn cầu theo mặc định, giá trị là 0. Ví dụ:Khởi tạo các biến tĩnh trong C

static int a; //although we do not initialize it, the value of a is 0 

nhưng những gì về cấu trúc dữ liệu sau:

typedef struct 
{ 
    int a; 
    int b; 
    int c; 
} Hello; 

static Hello hello[3]; 

là tất cả các thành viên trong mỗi struct của hello[0], hello[1], hello[2] khởi tạo như 0?

Trả lời

39

Có, tất cả thành viên được khởi tạo cho các đối tượng có bộ nhớ tĩnh. Xem 6.7.8/10 trong số C99 Standard (PDF document)

Nếu một đối tượng có thời lượng lưu trữ tự động không được khởi tạo rõ ràng, giá trị của nó không xác định. Nếu đối tượng có thời lượng lưu trữ tĩnh không được khởi tạo rõ ràng, thì:
- nếu đối tượng có loại con trỏ, nó được khởi tạo thành con trỏ rỗng;
- nếu nó có loại số học, nó được khởi tạo thành số không (dương hoặc không dấu);
- nếu đó là tổng hợp, mọi thành viên được khởi tạo (đệ quy) theo các quy tắc này;
- nếu đó là công đoàn, thành viên được đặt tên đầu tiên được khởi tạo (đệ quy) theo các quy tắc này.

Để khởi tạo tất cả mọi thứ trong một đối tượng, cho dù đó là static hay không, 0, Tôi thích sử dụng các phổ zero initializer

sometype identifier0 = {0}; 
someothertype identifier1[SOMESIZE] = {0}; 
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0}; 
+0

Tuyệt vời khi câu trả lời tham chiếu tài liệu chuẩn. +1 –

1

Vâng, họ đang có, chừng nào họ có tĩnh hay thời gian lưu trữ luồng.

C11 (n1570), § 6.7.9 Khởi # 10

Nếu một đối tượng có thời gian tĩnh hoặc sợi lưu trữ không được khởi tạo một cách rõ ràng, sau đó:

[... ]

  • nếu có loại số học, nó được khởi tạo thành số không (dương hoặc không dấu);
  • nếu nó là tổng hợp, mọi thành viên được khởi tạo (đệ quy) theo các quy tắc này, và bất kỳ phần đệm nào được khởi tạo thành 0 bit;

[...]

+1

[Dự thảo tiêu chuẩn C11 (tài liệu PDF)] (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1570.pdf) có sẵn trực tuyến miễn phí. – pmg

2

Vâng, các biến tĩnh file-phạm vi được khởi tạo bằng không, bao gồm tất cả các thành viên của cấu trúc, mảng vv

Xem this question để tham khảo (tôi' sẽ bỏ phiếu để đóng này như là một bản sao, quá).


Chỉnh sửa: Câu hỏi này là nhận được câu trả lời tốt hơn nhiều, vì vậy tôi bỏ phiếu để đóng rằng câu hỏi như một bản sao của này, để thay thế.

Để tham khảo, dưới đây là C FAQ link từ câu trả lời được chấp nhận của câu hỏi đó, mặc dù tất nhiên các tiêu chuẩn C99 và C11 được liên kết ở đây là chuẩn.

1

Tôi sẽ thêm các biến tĩnh (hoặc mảng) được phân loại thành hai loại.

Được khởi tạo là những giá trị được cung cấp từ mã tại thời gian biên dịch. Chúng thường được lưu trữ trong DS mặc dù đây là trình biên dịch cụ thể.

Loại khác là uninitialized thống kê được khởi tạo tại thời gian chạy và được lưu trữ vào phân đoạn BSS mặc dù một lần nữa đây là trình biên dịch cụ thể.

BSS

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