2009-04-01 40 views

Trả lời

26

mục 8.5.1.7 của dự thảo tiêu chuẩn:

-7- Nếu có ít initializers trong danh sách hơn là các thành viên trong tổng hợp , sau đó mỗi tôi mber không phải được khởi tạo rõ ràng sẽ là được khởi tạo mặc định (dcl.init). [Ví dụ:

struct S { int a; char* b; int c; }; 
S ss = { 1, "asdf" }; 

khởi ss.a với 1, ss.b với "asdf", và ss.c với giá trị của một biểu thức của int dạng(), có nghĩa là, 0 .]

+2

Con trỏ có được khởi tạo thành NULL không? – user10607

3

No. Nó được đảm bảo là 0.

+0

+1 câu trả lời đúng. –

24

Đảm bảo là 0 nếu được khởi tạo một phần, giống như bộ khởi tạo mảng. Nếu nó chưa được khởi tạo, nó sẽ không được biết.

struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to) 

struct T t = {42}; // t.y will be initialized to 0. 

Tương tự:

int x[10]; // Won't be initialized. 

int x[10] = {1}; // initialized to {1,0,0,...} 

mẫu:

// a.c 
struct T { int x, y }; 
extern void f(void*); 
void partialInitialization() { 
    struct T t = {42}; 
    f(&t); 
} 
void noInitialization() { 
    struct T t; 
    f(&t); 
} 

// Compile with: gcc -O2 -S a.c 

// a.s: 

; ... 
partialInitialzation: 
; ... 
; movl $0, -4(%ebp)  ;;;; initializes t.y to 0. 
; movl $42, -8(%ebp) 
; ... 
noInitialization: 
; ... ; Nothing related to initialization. It just allocates memory on stack. 
+0

Câu trả lời tuyệt vời với đầu ra ví dụ trình biên dịch. Tôi thật sự rất khó để quyết định có nên chấp nhận câu trả lời này hay câu trả lời của bb trong đó trích dẫn phần liên quan của thông số kỹ thuật. Tôi ước tôi có thể chấp nhận cả hai. – VoidPointer

+1

Lưu ý rằng nếu biến là toàn cầu, nó được đảm bảo để được khởi tạo bằng không trên Unix ngay cả khi không khởi tạo. Đó là một bảo đảm Unix mà tiếc là không tìm thấy trên Windows. – Juliano

+0

(OT) rằng ngôn ngữ lắp ráp của GCC thực sự xấu xí. – nothrow

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