✔ 最佳答案
所有string constant是存放在受保護而不能改動的記憶體位置,你硬把string constant cast成char*再改動其內容當然會有run-time error。這是錯誤的code,所有compiler都會compile出有問題的執行檔(除非你在一個沒有保護好記憶體的OS上運行)。實際上我很好奇VC++竟然沒有給予警告。如果你想assign "ABC"到char* bname,應該使用strcpy():#include <cstring>
class book {
public :
char *bname;
book(const char* bname) {
const size_t sz = strlen( bname ) +1;
this->bname = new char[sz];
fill( this->bname, this->bname +sz, '\0' );
strcpy( this->bname, bname );
}
};
你只要謹記string constant是constant,是const char*而非char*,就不會出錯的了。
2011-05-24 04:14:35 補充:
我想改一下我的字眼。
那句code本身其實是沒錯的,也因此沒有compiler會給你error(GCC會給warning),只是他所執行的動作不被Windows(和其他所有modern OS)所許可(安全理由)而被強制中止執行,所以出現run-time error。
2011-05-24 04:22:30 補充:
也就說,如果你找到一個不對特定記憶位置進行唯讀保護的OS,你的程式將會好好的運行,而"ABC"這string constant往後就會變成"ZBC"。