01/10/2018, 16:25
Char *str = "hello"; không dùng được trên visual studio 2017?
chào các bác, em đang học về lập trình, hôm nay đọc được một số tài liệu thấy ngta khai báo chuỗi kí tự như vậy:
char *str = "hello";
char str[] = "hello";
và khi em đem về dùng thử thì gặp lỗi ở kiểu khai báo đầu tiên, chương trình của em như vầy:
int main()
{
char *str = "hello"; // lỗi ở đây
_getch();
return 0;
}
Bộ trên vs2017 nó không cho dùng kiểu khai báo này sao? Các bác hỗ trợ giúp em với.
Bài liên quan
Bạn chụp hình cho mọi người xem lỗi. Kiểm tra các thư viện được include.
Lỗi báo rõ ràng rồi nhé.
“hello” được nhận dạng là 1 const char* thì nó không gán được cho một char*.
Có thể viết thế này:
Vậy sao bác trên kia lại khai báo được còn của em thì không? Bác nào biết cách sửa không giúp em với?
Đúng ra là
const char*
lí do là vì literal strings không sửa được (segfault) nên khôngconst
nó không chịu. Mấy ver sau của VS càng lúc càng nhắng nên thôi dùng IDE khác vậy, nó chỉ có mỗi C# là dùng được.Sách nào viết là
char * s = "hello"
thì đốt sách đó đi, đơn giản.Vì đó là cách viết sai, và cái đơn giản viết còn ko đúng thì mấy cái khó hơn viết chắc còn sai tùm lum nữa, đốt đi là cách tốt nhất. Phải cám ơn trình biên dịch nó cấm viết như vậy mới đúng. Trình dịch nào cho phép thì uninstall nó ngay ~.~
Trong C thì nó vẫn hợp lệ chứ nhỉ, C++ thì ko hợp lệ. Tuy nhiên dùng
const char *str
vẫn tường minh hơn.ANSI C: Pointers to strings literals
https://daynhauhoc.com/t/khac-biet-giua-khai-bao-mang-char-va-con-tro-char/3600
Em tìm hiểu về con trỏ và chuỗi thì thấy mấy bài này, trong đó thấy họ khai báo như vậy em mới đem về thử thôi mà
câu hỏi hay có đóng góp lớn về sự cập nhập kiến thức
Sao lại đốt sách với gỡ trình dịch đi nhỉ? Mình nghĩ người ta có quyền khai báo char* s = “hello” chứ, miễn là người sử dụng hiểu rõ và chú ý không thay đổi nội dung mà con trỏ *s trỏ tới là được chứ. GCC phổ biến như thế vẫn cho phép khai báo đấy thôi, vậy cũng phải gỡ đi ư? Còn Visual Studio của Microsoft taoj ra rule riêng của họ thì mình muốn dùng thì phải tuân thủ thôi.
Đúng vậy, bắt
const char*
như vậy là nannyCompiler cho viết
char *s = "abc";
không có nghĩa là nên viếtchar *s = "abc";
. Bởi vìabc
luôn nằm trong phần read-only section (.rodata) của chương trình,abc
mặc định không đc đổi -> thêm const để nhấn mạnh ý đó.GCC nó cho phép ko có nghĩa là nó đúng. Thế bạn có viết kiểu này ko?
ko bao giờ đúng ko? Vì 2 là hằng số, two là biến thay đổi được lại tham chiếu tới hằng số, vậy là sai. Tương tự về mặt logic, “hello” là hằng mảng ký tự, vậy tại sao lại cho phép biến thay đổi được lại trỏ tói “hello” được? Chỉ vì mảng ký tự có tồn tại trên vùng nhớ nên bạn được quyền trỏ lung tung bất chấp ko thay đổi giá trị vùng nhớ đó được?
const char[6]
decay thànhconst char*
, nhưngconst char*
khác vớichar*
, ai cho phép bạn tự tiện ép kiểu const thành non-const? Trỏ tới vùng ko thay đổi được phải ghicon trỏ tới const char
rõ ràng, Ko có const trình dịch phải la làng là đúng. Nói “sốc” hơn 1 tí là trình dịch nào ko la thì uninstall nó, nói sốc như vậy để gây ấn tượng mạnh dẫn tới nhớ lâu hơn là trình dịch này dỏm ở chỗ này, ko nhất thiết phải uninstall nó, nhưng ai làm theo thì cũng được thôi =)bạn nói “miễn là người sử dụng hiểu rõ và chú ý không thay đổi nội dung mà con trỏ *s trỏ tới là được” vậy đẻ ra keyword
const
làm gì nữa, cứ để người sử dụng tự quyêt là được? Nói rộng ra hơn nữa đẻ ra keywordprivate
,protected
trong class làm chi cho mất công vậy, người dùng tự biết được rồi. Đẻ ra mấy từ khóa này là để người sử dụng ko tự chỉa súng vô hạ bộ của họ, họ đi đứng thì ko sao chứ cuối xuống lụm tờ $100 là tàn đời trai ngay.GCC thì chỉ cần thêm
-pedantic-errors
vào là nó la to hơn. Nếu bạn rảnh hơi hơn nữa thì phải sửa cho hết warning, chứ ko chỉ sửa hết error là được. Khi biên dịch 1 chương trình nó ói ra hằng trăm warnings thì mọi người sẽ nghĩ gì về người viết chương trình đó? Lười biếng? Viết code ẩu? Ko thèm quan tâm tới chất lượng code? 1 số trường hợp lờ warning đi là sai lầm: vd trong C viếtgets(line)
được ko có nghĩa là nó an toàn, trình dịch điêu thì nó chỉ nói nhỏ warning cho mình lờ đi, trình dịch tốt bụng thì nó la làng thành error bắt mình phải sửa. Nó to mồm khó chịu hơn nhưng nó giúp mình viết code ít sai hơn. Lâu lâu rảnh rỗi thì đi tìm mấy cái flag warning về thêm vào cho nó la ỏm tỏi lên =), lúc đó mới biết code ngu như thế nào.Bạn ơi đang là tag
C
, không phảiC++
. Và chuẩnC
vẫn cho phép dùngchar *str = "a";
.vậy sửa lại thành
sai về mặt logic, còn nói là biên dịch được chạy được thì cũng được thôi, C mà, thích viết gì chả được
trong C++
nó lại báo là
char* thì coi là warning, int* thì coi là lỗi, lạy ông GCC.
Có
-std=c++11
ko trước đó thì chỉ mới deprecate thôi.