【问题标题】:Compiler warning when char * set to string literalchar * 设置为字符串文字时的编译器警告
【发布时间】:2012-02-16 04:40:32
【问题描述】:

在我的代码中

char* s = strchr(first,'/');
if(s==NULL) s = "";
else s = s+1;

但我的 gcc 编译器在倒数第二行抱怨

warning: assignment discards qualifiers from pointer target type

根据我对 ANSI C 的理解,这是因为我将 s(一个非常量值)设置为字符串文字(一个 const 值)。 (我错了吗?)但是我需要 s 是非常量的(因为我可能会通过向其添加 1 来更改它的值),并且我还需要将 s 设置为空字符串文字。在没有编译器大喊大叫的情况下,我有什么更好的代码设计选项来实现这两个目标吗?

我确实启用了 -Wwrite-strings 标志。

【问题讨论】:

  • 真的很难说。再来点代码怎么样?你想做什么?您只是想将其指向其他地方还是要修改 strchr 返回的字符串?
  • 您打算对空字符串进行哪些修改?
  • '然而我需要 s 是非常量' 为什么?
  • @Chris:查看我在上面所做的编辑以了解原因。

标签: c char constants


【解决方案1】:

您需要s 不是const,还是需要s 才能解决常量存储问题?有很大的不同。在前一种情况下,您可以简单地转换为char*。在后一种情况下,您必须 malloc 所需的存储空间(或为 s 分配适当范围的 char[] 值的地址)。

【讨论】:

    【解决方案2】:

    您应该使用strcpy 而不是分配字符串文字。问题是字符串字面量是常量,s 将包含该字符串的地址,而不是字符串本身,这很糟糕。

    例如,如果您有:

    char str[100];
    str = "Hello world";
    

    分配的 100 个字符的地址将替换为"Hello world" 常量字符串的地址。

    使字符串为空的最简单方法是将第一个值设置为 NULL (*s = NULL);

    【讨论】:

    • 您不能将字符串文字分配给数组。 char str[100] = "Hello world"; 可以,但char str[100]; str = "Hello world"; 不行。
    • @KennyTM 这就是我试图解释的,这是不正确的,因为您试图为 str 指针分配一个不同的地址
    • 不是地址,而是类型不兼容。不能将指针分配给数组。
    • 在 c/c++ 中,数组和指针非常相似......我的意思是,你可以调用一个具有 int* 参数的函数,然后给它一个数组,然后你可以访问使用 [] 运算符的指针中的地址后的第一项。但是,编译器可能有保护,以防止更改地址。
    • 数组可能会衰减为指针,但不能反过来。还有,you cannot assign anything to an array[] 运算符无关紧要,顺便说一句,您可以使用 1["hi"],但这并不意味着 int 类似于指针。
    【解决方案3】:

    如果你想写:

    char * s = "Red";
    if (Massachusetts) {
       s = "Blue";
    }
    

    然后只需添加 const。它会正常工作的。

    如果真的需要修改字符串,那么

    char *s = malloc(64);
    strcpy (s, "Red");
    if (Massachusetts) {
        strcat(s, "-not");
    }
    

    【讨论】:

      【解决方案4】:

      如果您不打算修改s指向的对象,请将s的类型更改为const char *s;

      如果你要修改它,那么将它指向一个内容是非法修改的字符串(无论这对于 C 语言来说是非法的,还是仅仅根据你程序的其余接口的约定)是一个严重的错误,并且您需要确保在可能修改字符串时复制该字符串。

      【讨论】:

        猜你喜欢
        • 2021-07-02
        • 2016-05-29
        • 2013-02-28
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 2017-03-13
        相关资源
        最近更新 更多