Tôi xin sửa lại!
Code:
char *a = "abasd";
hay
char *a;
a = "adaskjdaskdj";
TẤT CẢ ĐỀU SAI!!!
Tôi sẽ phân tích cái lỗi này cho các bạn xem! Bởi vì nó không xuất hiện ngay lập tức mà phải một thời gian sử dụng bộ nhớ nó mới xuất hiện. Ở Visual C rất khó thấy cái này vì nó hỗ trợ bộ nhớ tới stack 4MB, nhưng với Borland C 3.1 thì rõ ràng vì nó là ứng dụng 16 bit nên chỉ có 64Kb.
Tại sao sai???
char *p;
Nó chỉ là một con trỏ và trỏ đại một ví trị bất kỳ nào đó.
Bạn khai báo:
a = "abcd";
Không vấn đề gì vì bộ nhớ đang trống rất nhiều.
Nhưng đến một lúc nào đó thì sẽ xuất hiện trường hợp "rác" trong chuỗi ký tự, ví dụ như nó sẽ là:
cout << a; -> "abcd@!*#&AKDHasjdhyqwue"
Bởi vì không ai xác nhận vùng nhớ mà ta gán "abcd" là vùng nhớ đã cấp phát! Sau nhiều lần gán thì nó sẽ bị chồng chép lên nhau!
Tuy nhiên khi ta khai báo.
-> char str[] = "HELLO ABCDEF";
Đây mới là cách khai báo đúng mà tôi nhầm;
Mặc định nó sẽ là strlen("HELLO ABCDEF") byte được cấp phát và không có ai can thiệp bộ nhớ của nó.
Test 1 cái đơn giản:
char *a = "cong hoa xa hoi";
strcpy(a,"abcd"); // Lỗi ngay lập tức khi chạy.
char a[] = "cong hoa xa hoi"
strcpy(a,"data"); // Không lõi!
Tôi đã từng bị lỗi này rồi nên tôi nhớ. Sử dụng con trỏ không cấp phát là điều kiên kỵ nhất của C/C++. Do đó luôn xác định trước kích thước của nó khi sử dụng!
Tôi nói ra không vừa ý thì thôi! Đừng chửi ngu vì hãy xem lại mình.
Bookmarks