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ỏfookiểuconst char*và gán cho nó địa chỉ của chuỗi ký tự "wow". Vìfoolà 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ỏfookhô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àfootrỏ 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.





