What is output? #include
Trả lời:
Đáp án đúng: A
Trong C, kích thước của một cấu trúc có thể không đơn giản là tổng kích thước của các thành phần của nó do padding (phần đệm) để đảm bảo việc căn chỉnh bộ nhớ cho các thành viên. Điều này đặc biệt quan trọng trên các kiến trúc 32-bit hoặc 64-bit, nơi việc truy cập dữ liệu không được căn chỉnh có thể chậm hơn hoặc thậm chí gây ra lỗi.
Trong cấu trúc `A`:
- `int a[2]`: Mảng 2 số nguyên. Giả sử `int` là 4 byte, thì kích thước của `a` là 2 * 4 = 8 byte.
- `char b[5]`: Mảng 5 ký tự. Kích thước là 5 byte.
- `char c[5]`: Mảng 5 ký tự. Kích thước là 5 byte.
Tổng kích thước "thô" là 8 + 5 + 5 = 18 byte.
Tuy nhiên, trình biên dịch có thể thêm padding sau `b` để đảm bảo `c` được căn chỉnh đúng cách. Trong nhiều trường hợp, cấu trúc được căn chỉnh theo kích thước của phần tử lớn nhất (ở đây là `int` với 4 bytes hoặc 8 bytes tùy thuộc vào hệ thống). Do đó, có khả năng padding được thêm vào sau `b` để kích thước của `b` trở thành bội số của 4 hoặc 8. Tương tự, có thể có padding ở cuối struct để đảm bảo rằng các mảng của struct này trong một mảng các struct được căn chỉnh đúng cách.
Trong trường hợp này, không có padding, kích thước sẽ là 18. Nếu có padding 2 bytes sau b, kích thước là 20 bytes. Nếu padding là để đảm bảo căn chỉnh 4 byte, thì tổng kích thước có thể là 8 + 8 + 8 = 24 bytes.
Tuy nhiên, kết quả thực tế phụ thuộc vào trình biên dịch, các tùy chọn biên dịch và kiến trúc hệ thống. Trong nhiều trường hợp, padding được thêm vào để đảm bảo rằng mọi thành phần trong struct được căn chỉnh theo địa chỉ bộ nhớ thích hợp.
Trong trường hợp này, đáp án D. 24 là đáp án hợp lý nhất, giả sử có padding để đảm bảo các thành viên được căn chỉnh đúng.
Lưu ý: Output thực tế có thể khác nhau tùy thuộc vào trình biên dịch và nền tảng.