1. 从产生警告的代码看起
// 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]
警告: 弃用的转换从字符串到char *
2. 警告产生的原因?
"other"是字符串常量, 内存分配在全局的const内存区
char * 声明了一个指针,而这个指针指向的是全局的const内存区,const内存区当然不会让你想改就改的。所以,如果你一定要写这块内存的话,那就是一个非常严重的内存错误。
测试如下代码:
char* p1 = "anything";
char* p2 = "anything";
printf(“ p1=%p, p2=%p /n”, p1, p2);
结果会显示p1和p2的地址是不一样的.
3. 如何正确使用char * ?
- 采用const char * 声明
const char *p = "test";
这样,当你修改这个字符串的内容时,编译器会给你一个错误而导致你的程序编译不通过,从而不会产生运行时的内存错误。
- 改用 char [ ] 进行声明
char p[] = "test";
- 改用 std::string声明
std::string p = "test"