正确使用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" 说起

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,670评论 19 139
  • 说明本次redis集群安装在rhel6.8 64位机器上,redis版本为3.2.8,redis的gem文件版本为...
    读或写阅读 15,416评论 3 9
  • 【转载】原文地址:std::string详解作者:kieven2008 之所以抛弃char*的字符串而选用C++标...
    VAYY阅读 3,860评论 0 2
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 8,745评论 0 6
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 5,698评论 0 4