2012-01-04 28 views
6

Cấu trúc được định nghĩa như sauHàm sizeof() hoạt động như thế nào đối với các cấu trúc trong C?

typedef struct Sample 
{ 
    int test; 
    char strtest; 
} Sample; 

Trong chức năng chính, tôi gọi là cấu trúc của cấu trúc.

sizeof(struct Sample) 

Tôi đã nghe giá trị trả về của sizeof trên cấu trúc có thể không chính xác. Nếu đây là trường hợp, tôi nên làm gì để có được giá trị đúng?

+1

với ra một typedef trong phạm vi 'Mẫu' không phải là một loại hợp lệ. Bạn đang sử dụng một trình biên dịch C++ cho mã C? Tôi đề nghị bạn không làm điều đó ... và nếu 'Sample' là một đối tượng thì dấu ngoặc đơn thừa. – pmg

+0

sizeof không phải là một hàm, mà là một chỉ thị của trình biên dịch. Nó có nghĩa là nó không phải là thời gian chạy thực thi, nhưng nó được thay thế bằng giá trị tương ứng tại thời gian biên dịch. – Rolice

+0

Nó không bao giờ "không chính xác". Chỉ hiểu biết của bạn là thiếu, không phải trình biên dịch. –

Trả lời

22

Trả về giá trị đáng tin cậy - không phải lúc nào cũng là giá trị bạn mong đợi.

Trong cấu trúc mẫu, bạn giả định một byte 1 byte và 4 byte int, nhưng bạn không nhận được kết quả là "5".

Vì cấu trúc được đệm để các phần tử bắt đầu trên ranh giới tự nhiên của chúng. bạn có nhiều khả năng nhận được kết quả là "8".

Wiki giải thích điều này khá tốt: http://en.wikipedia.org/wiki/Sizeof - tại "Cấu trúc đệm", gần phía dưới cùng.

+0

@ Karthik: Có độc lập với nền tảng không? – Karai

+0

Không, nó không phải là nền tảng độc lập; nó thậm chí không nhất thiết * trình biên dịch * độc lập. –

+0

@ Ernest: u có thể giải thích suy nghĩ của bạn – Karai

1

Sizeof không phải là hàm; nó là một nhà điều hành . Đó là kết quả luôn luôn đúng, nhưng đôi khi bất ngờ, do đệm, hoặc niềm tin rằng nó là một xác định kích thước mảng ma thuật.

Là một toán tử, các dấu ngoặc đơn không cần thiết nếu hành động trong một biến.

int foo; 
printf("%zu\n", sizeof foo); 

là hoàn toàn hợp pháp.

+0

bạn nên sử dụng '% zu' với' sizeof', '% d' đặc tả chuyển đổi với' sizeof' là không xác định – ouah

1

sizeof với loại cấu trúc hoạt động giống như với bất kỳ loại nào khác: kết quả của toán tử là kích thước của loại theo byte. Kích thước của kiểu cấu trúc giống như kích thước của một đối tượng thuộc kiểu cấu trúc này.

sizeof đối tượng kết cấu có thể lớn hơn kích thước của các phần tử khác nhau của các loại cấu trúc do đệm.

Có thể có đệm số không xác định các byte sau mỗi thành viên cấu trúc và đệm được đưa vào tài khoản trong kích thước của các loại cấu trúc (hoặc của một đối tượng của kiểu cấu trúc)

Để in kích thước của một loại cấu trúc sử dụng specifier z chuyển đổi trong một chuỗi định dạng printf:

printf("%zu\n", sizeof (struct my_structure_type)); 
Các vấn đề liên quan