Đá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.