JavaScript is required

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

A.

8 4 1

B.

B.8 2 1

C.

4 4 1

D.

Phụ thuộc vào người biên dịch

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.

Câu hỏi liên quan