char *设置为字符串文字时的编译器警告

时间:2012-01-22 13:16:17

标签: c char const

在我的代码中我有

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值)设置为字符串文字(const值)。 (我错了吗?)但我需要s为非const(因为我可能通过向它添加1来改变它的值),而且我还需要将s设置为空字符串文字。在没有编译器大喊大叫的情况下,我是否有更好的代码设计选项来实现这两个目标?

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

4 个答案:

答案 0 :(得分:3)

如果你想写:

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

如果你要修改它,然后将它指向一个字符串,其内容是非法的修改(无论是C语言是非法的,还是仅仅通过程序其余接口的合同)是一个严重的错误,并且你需要确保在有可能修改它的时候复制字符串。

答案 3 :(得分:0)

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

例如,如果你有:

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

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

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