JavaScript is required

What is output? #include #include struct { short s[5] union { float y; long z; }u; } t; void main() { printf("sizeof(st) = %d", sizeof(t)); getch(); }

A.

16

B.

22

C.

32

D.

18

Trả lời:

Đáp án đúng: A


Đề bài yêu cầu xác định kích thước của struct `t`. Trong struct `t`, ta có một mảng `s` kiểu `short` có 5 phần tử, mỗi phần tử `short` chiếm 2 bytes, vậy mảng `s` chiếm 5 * 2 = 10 bytes.

Tiếp theo là union `u`. Trong union, các thành viên chia sẻ cùng một vùng nhớ. Kích thước của union là kích thước của thành viên lớn nhất. Trong union `u`, ta có `float y` và `long z`. Giả sử kích thước của `float` và `long` đều là 4 bytes.

Vậy, kích thước của union `u` là max(sizeof(float), sizeof(long)) = max(4, 4) = 4 bytes.

Tổng kích thước của struct `t` là kích thước của mảng `s` cộng với kích thước của union `u`, tức là 10 + 4 = 14 bytes.

Tuy nhiên, cần xem xét đến padding (phần đệm). Để đảm bảo việc truy cập các thành viên của struct được hiệu quả (thường là bội số của kích thước từ của CPU), compiler có thể thêm các byte padding.

Trong trường hợp này, giả sử không có padding ở cuối struct. Khi đó sizeof(t) = 14.

Tuy nhiên, không có đáp án nào là 14. Xem xét đến khả năng có padding:

  • Nếu padding để kích thước struct là bội số của 2, thì padding là 0 và kích thước là 14.
  • Nếu padding để kích thước struct là bội số của 4, thì padding là 2 và kích thước là 16.

Đáp án A (16) có thể là đáp án đúng nếu compiler thêm padding để kích thước của struct là bội số của 4.

Đáp án B (22), C (32), D (18) không phù hợp.

Vậy, đáp án phù hợp nhất là A. 16

Câu hỏi liên quan