Chọn kết quả đúng cho chương trình sau: #include
Trả lời:
Đáp án đúng: D
Chương trình C này sử dụng một cấu trúc (struct) có tên `sv` để lưu trữ thông tin về một đối tượng, bao gồm một số thực dấu phẩy động `d` và một chuỗi ký tự `ht`.
Hàm `main` thực hiện các bước sau:
1. **Khai báo và khởi tạo:**
- Khai báo một biến `m` kiểu `struct sv`.
- Khai báo một con trỏ `p` kiểu `struct sv *` và gán địa chỉ của `m` cho `p`. `p = &m;`
2. **Gán giá trị:**
- `(*p).d = p->d = 10;` Dòng này gán giá trị 10 cho thành viên `d` của cấu trúc `m` thông qua cả hai cách truy cập: sử dụng con trỏ `p` với cú pháp `(*p).d` và `p->d`. Vì cả hai cách đều truy cập vào cùng một biến `m.d`, giá trị cuối cùng của `m.d` là 10.
3. **Sao chép chuỗi:**
- `strcpy(m.ht, "NguyenVanTuan");` Sao chép chuỗi "NguyenVanTuan" vào thành viên `ht` của cấu trúc `m`.
4. **In ra màn hình:**
- `printf("%0.1f", m.d);` In giá trị của `m.d` với định dạng số thực dấu phẩy động, hiển thị một chữ số sau dấu phẩy. Kết quả sẽ là "10.0".
- `printf("%s", m.ht);` In chuỗi ký tự được lưu trữ trong `m.ht`. Kết quả sẽ là "NguyenVanTuan".
Kết hợp cả hai lệnh `printf`, ta được kết quả cuối cùng là "10.0NguyenVanTuan".
Tuy nhiên, chương trình sử dụng hàm `clrscr()` mà không có thư viện tương ứng (ví dụ, `conio.h` trên Turbo C++), và `strcpy` có thể gây ra lỗi buffer overflow nếu chuỗi nguồn dài hơn kích thước của mảng đích `ht` (10 ký tự). Trong trường hợp này, "NguyenVanTuan" dài hơn 10 ký tự (bao gồm cả '\0'), dẫn đến tràn bộ nhớ. Do đó, đáp án chính xác nhất là chương trình bị lỗi do lỗi tràn bộ nhớ khi sao chép chuỗi. Vì đề bài không đưa ra compiler options cụ thể, chúng ta sẽ giả định trình biên dịch sẽ báo lỗi hoặc chương trình sẽ crash khi thực thi.
Tuy nhiên, dựa trên các kết quả biên dịch thông thường(ví dụ gcc trên linux), chương trình có thể vẫn chạy và in ra kết quả nhưng có thể gây ra những hành vi không mong muốn. Tuy nhiên, xét về mặt lý thuyết và mục đích của câu hỏi, việc `strcpy` có khả năng gây tràn bộ đệm nên đáp án C hợp lý hơn.