Khi thực thi đoạn mã c sau, kết quả sẽ là gì? Biết kích thước kiểu char : 1 byte, float : 4 byte, int : 4 byte, double : 8 byte, long : 4 byte. #include
Trả lời:
Đáp án đúng: A
Đề bài cho đoạn code C với một struct và yêu cầu xác định kết quả khi chạy chương trình.
Struct `A` có 3 trường: `x` (char), `y` (float), `z` (int). Do có hiện tượng padding trong struct để đảm bảo các biến thành viên được căn chỉnh theo địa chỉ thích hợp, nên kích thước của struct `A` sẽ được tính như sau:
- `x` (char): 1 byte
- `y` (float): 4 byte. `x` sẽ được padding thêm 3 byte để `y` bắt đầu ở địa chỉ chia hết cho 4.
- `z` (int): 4 byte.
Tổng kích thước struct `A` là 1 + 3 + 4 + 4 = 12 bytes.
Mảng `arr` có 5 phần tử, mỗi phần tử là kiểu struct `A`. Vậy kích thước của mảng là 5 * 12 = 60 bytes.
`A *p = arr;` khai báo con trỏ `p` kiểu `A*` và gán cho nó địa chỉ của phần tử đầu tiên trong mảng `arr`.
`A *q = arr + 3;` khai báo con trỏ `q` kiểu `A*` và gán cho nó địa chỉ của phần tử thứ 4 trong mảng `arr` (arr[3]).
`long k = q - p;` tính khoảng cách giữa địa chỉ của `q` và `p`. Do `q` và `p` đều là con trỏ kiểu `A*`, kết quả phép trừ sẽ là số phần tử kiểu `A` giữa `q` và `p`, tức là 3. Vì k là long, có kích thước 4 byte, nên giá trị của k sẽ là 3.
`int t = (int)( (char*)q - (char*)p );` ép kiểu `q` và `p` sang `char*`, sau đó tính hiệu. Lúc này, hiệu là số byte giữa hai con trỏ. Khoảng cách giữa `q` và `p` là 3 * sizeof(A) = 3 * 12 = 36 bytes. Vì t là int, kích thước 4 byte, nên giá trị của t sẽ là 36.
`char h = (char)( (int)q - (int)p );` ép kiểu `q` và `p` sang `int`, sau đó tính hiệu (36). Vì h là char, kích thước 1 byte, nên giá trị của h sẽ là 36 % 256 = 36.
Vậy, kết quả in ra sẽ là: 8 4 1.