正确使用char *: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

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"

参考资源
CSDN: 从语句 char* p="test" 说起

你可能感兴趣的:(正确使用char *: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings])