美文网首页
正确使用char *: warning: deprecated

正确使用char *: warning: deprecated

作者: wuzhiguo | 来源:发表于2016-09-11 22:16 被阅读3296次

    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

          本文链接:https://www.haomeiwen.com/subject/xtzuettx.html