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; }
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ểuconst 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 chofoo
đị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) chofoo[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.