JavaScript is required

Anh (Chị) hãy cho biết, chương trình sau sai ở dòng nào?

1 .struct hocsinh {

2. string hoten;

3. int namsinh;

4.} ;

5 .int main() {

6. hocsinh hs[3]

7. hocsinh *p = hs;

8. for (int i = 0; i < 3; i++) {

9. p->namsinh = 1991 + i;

10. p++;

11. }

12. *p = hs+1;

13. p.namsinh -= 20;

14. cout << *p.namsinh << endl;

15. return 0;

16.}

 

A.

A. Không sai dòng nào.

B.

B. 9, 12, 14

C.

C. 12, 13, 14

D.

D. 9, 13, 14

Trả lời:

Đáp án đúng: C


Phân tích lỗi trong chương trình C++: * **Dòng 9:** `p->namsinh = 1991 + i;` * Lỗi: Không có lỗi cú pháp, nhưng về mặt logic, dòng này đang gán giá trị cho `namsinh` của phần tử hiện tại mà con trỏ `p` đang trỏ tới. * **Dòng 12:** `*p = hs+1;` * Lỗi: Dòng này cố gắng gán địa chỉ `hs+1` (địa chỉ của phần tử thứ hai trong mảng `hs`) cho *giá trị* mà con trỏ `p` đang trỏ tới. Đây là một lỗi nghiêm trọng vì kiểu dữ liệu không tương thích. `*p` có kiểu `hocsinh`, trong khi `hs+1` có kiểu `hocsinh*`. Bạn không thể gán một con trỏ cho một biến cấu trúc trực tiếp như vậy. Hơn nữa, sau vòng lặp, `p` đã trỏ ra ngoài mảng `hs`, nên việc truy cập `*p` sẽ gây ra lỗi runtime (segmentation fault hoặc tương tự). * **Dòng 13:** `p.namsinh -= 20;` * Lỗi: `p` là một con trỏ (`hocsinh *`). Để truy cập thành viên của cấu trúc mà `p` trỏ tới, bạn cần sử dụng toán tử `->`, không phải `.`. Cách viết đúng phải là `p->namsinh -= 20;`. * **Dòng 14:** `cout << *p.namsinh << endl;` * Lỗi: Tương tự như dòng 13, `p` là một con trỏ, nên phải sử dụng `->`. Ngoài ra, `p->namsinh` là một số nguyên (kiểu `int`), không phải con trỏ. Việc sử dụng `*` trước `p->namsinh` là sai. Hơn nữa, sau khi gán sai ở dòng 12, `p` có thể trỏ đến một vùng nhớ không hợp lệ, do đó việc truy cập `*p.namsinh` (nếu cú pháp đúng) có thể gây ra lỗi runtime. Như vậy, các dòng sai là 12, 13 và 14.

Câu hỏi liên quan