Anh (Chị) hãy cho biết, chương trình sau sai ở dòng nào?
1. char ReChar (char str) {
2. int len = strlen (str);
3. char ketqua = new char[len+1]
4. for (int i = 0; i < len; i++) ketqua[i] = str[len-i-1]
5. ketqua[len] = '\0';
6. return ketqua;
7. }
8. int main() {
9. char p[] = 178892”;
10. cout << ReChar (p) << endl;
11. return 0;
12.}
Trả lời:
Đáp án đúng: A
Chương trình có một số lỗi sau:
* **Dòng 3:** `char ketqua = new char[len+1]`
* Lỗi: Cấp phát bộ nhớ bằng `new char[len+1]` trong C++ thì phải giải phóng bằng `delete[] ketqua` để tránh rò rỉ bộ nhớ. Tuy nhiên, chương trình không có dòng lệnh giải phóng này. Hơn nữa, kiểu trả về của hàm là `char` trong khi `ketqua` là một con trỏ (`char*`). Do đó, có sự không tương thích về kiểu dữ liệu. Sửa lại: `char* ketqua = new char[len+1];`
* **Dòng 6:** `return ketqua;`
* Lỗi: Hàm `ReChar` khai báo kiểu trả về là `char` (một ký tự), nhưng lại trả về `ketqua` là một con trỏ đến mảng các ký tự (chuỗi). Điều này gây ra lỗi biên dịch. Hơn nữa, sau khi hàm kết thúc, bộ nhớ được cấp phát cho `ketqua` sẽ không còn được quản lý (vì biến cục bộ `ketqua` biến mất), nhưng vùng nhớ đó vẫn còn tồn tại, dẫn đến rò rỉ bộ nhớ nếu không được giải phóng đúng cách. Để sửa lỗi này, ta nên thay đổi kiểu trả về của hàm thành `char*`.
* **Dòng 9:** `char p[] = 178892”`
* Lỗi: `char p[]` được khởi tạo bằng một số nguyên (`178892”`), trong khi nó phải là một chuỗi ký tự (ví dụ: `"178892"`).
* **Dòng 4:** Vòng lặp không kiểm tra điều kiện i < len. Sửa lại: `for (int i = 0; i < len; i++) ketqua[i] = str[len-i-1]`
Như vậy, các dòng 1 và 3 có lỗi về mặt kiểu dữ liệu trả về và cấp phát bộ nhớ không hợp lý.