从指针目标类型抛出限定符?

时间:2012-04-16 20:21:03

标签: c gcc

-Wcast-qual在stristr()的return行上输出此警告。有什么问题?

  

警告:从指针目标类型

转换丢弃限定符
char *stristr(const char *string, const char *substring)
{
size_t stringlength = strlen(string);
char *stringlowered = malloc(stringlength + 1);
strcpy(stringlowered, string);
tolower2(stringlowered); // in my source it has a different name, sorry.

char *substringlowered = malloc(strlen(substring) + 1);
strcpy(substringlowered, substring);
tolower2(substringlowered); // in my source it has a different name, sorry.

const char *returnvalue = strstr(stringlowered, substringlowered);
if(returnvalue != NULL)
{
    size_t returnvaluelength = strlen(returnvalue);
    returnvalue = string;
    returnvalue += stringlength - returnvaluelength;
}

free(stringlowered);
free(substringlowered);

return (char *)returnvalue;
}

编辑:
在glibc 2.15的strstr()源代码中:

return (char *) haystack_start; // cast to (char *) from const char *

3 个答案:

答案 0 :(得分:8)

您已将returnvalue声明为指向const char的指针,但之后您已将其转换为指向非const char的指针。您已经放弃了const限定符,因此编译器会抱怨您已将其丢弃!

解决方案是要么改变函数的返回类型,要么找到非const char来指向。你的函数中没有一个,所以如果确实需要非const返回类型,你可以考虑更改参数类型。

答案 1 :(得分:5)

您正在将const char *(我们称之为不可修改的字符串)转换为char *(可修改的字符串),您放弃了const限定符。

答案 2 :(得分:0)

尝试更改声明/作业

const char *returnvalue = strstr(stringlowered, substringlowered);

char *returnvalue = strstr(stringlowered, substringlowered);

然后删除返回行中的强制转换(您不再需要它)。