1. 從產(chǎn)生警告的代碼看起
// worker0.h
class Singer: public Worker
{
protected:
enum {
other,
alto,
contralto,
soprano,
bass,
baritone,
tenor
};
enum {
Vtypes = 7
};
private:
static char * pv[Vtypes]; // string equivs of voice types
int voice;
...
}
// worker0.cpp
...
char * Singer::pv[] = {"other", "alto", "contralto",
"soprano", "bass", "baritone", "tenor"};
...
編譯提示警告:
warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
警告: 棄用的轉(zhuǎn)換從字符串到char *
2. 警告產(chǎn)生的原因?
"other"是字符串常量, 內(nèi)存分配在全局的const內(nèi)存區(qū)
char * 聲明了一個(gè)指針垄开,而這個(gè)指針指向的是全局的const內(nèi)存區(qū)宋舷,const內(nèi)存區(qū)當(dāng)然不會(huì)讓你想改就改的。所以,如果你一定要寫這塊內(nèi)存的話辩块,那就是一個(gè)非常嚴(yán)重的內(nèi)存錯(cuò)誤欣舵。
測(cè)試如下代碼:
char* p1 = "anything";
char* p2 = "anything";
printf(“ p1=%p, p2=%p /n”, p1, p2);
結(jié)果會(huì)顯示p1和p2的地址是不一樣的.
3. 如何正確使用char * ?
- 采用const char * 聲明
const char *p = "test";
這樣葱轩,當(dāng)你修改這個(gè)字符串的內(nèi)容時(shí)屠阻,編譯器會(huì)給你一個(gè)錯(cuò)誤而導(dǎo)致你的程序編譯不通過,從而不會(huì)產(chǎn)生運(yùn)行時(shí)的內(nèi)存錯(cuò)誤策菜。
- 改用 char [ ] 進(jìn)行聲明
char p[] = "test";
- 改用 std::string聲明
std::string p = "test"