JavaScript is required

For the code below which lines should be reported as errors by a compiler? int main(int argc, char** argv) { const char* foo = "wow"; // line 1 foo = "top"; // line 2 foo[0] = 1; // line 3 return 0; }

A.

1

B.

2

C.

3

D.

None of the lines

Trả lời:

Đáp án đúng: C


Hãy xem xét từng dòng mã để xác định lỗi:

  • Dòng 1: const char* foo = "wow"; - Khai báo một con trỏ foo kiểu const char* và gán cho nó địa chỉ của chuỗi ký tự "wow". Vì foo là con trỏ đến một chuỗi ký tự hằng (const char*), việc này là hợp lệ.
  • Dòng 2: foo = "top"; - Gán cho foo địa chỉ của một chuỗi ký tự hằng khác "top". Bản thân con trỏ foo không phải là const, nên việc thay đổi địa chỉ mà nó trỏ tới là hợp lệ.
  • Dòng 3: foo[0] = 1; - Cố gắng thay đổi ký tự đầu tiên của chuỗi ký tự mà foo trỏ tới. Tuy nhiên, foo đang trỏ tới một chuỗi ký tự hằng (string literal), và các chuỗi ký tự hằng thường được lưu trữ trong vùng nhớ chỉ đọc (read-only memory). Do đó, việc cố gắng ghi vào vùng nhớ này sẽ gây ra lỗi (thường là segmentation fault hoặc access violation) khi chương trình chạy. Hơn nữa, việc gán giá trị 1 (tương đương với ký tự có mã ASCII là 1) cho foo[0] sẽ thay đổi nội dung của chuỗi.

Vì vậy, dòng 3 sẽ được trình biên dịch (hoặc hệ điều hành khi chạy) báo lỗi.

Câu hỏi liên quan