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

Nig*_*ley 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

return (char *) haystack_start; // cast to (char *) from const char *
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 8

您已声明returnvalue为指向a的指针const char,但之后您将其转换为指向非指针const char.你已经放弃了const限定符,所以编译器抱怨你丢弃了它!

解决方案是更改函数的返回类型,或者找到非const char指向的函数.您的函数中没有一个,因此如果确实需要非const返回类型,可以考虑更改参数类型.


MBy*_*ByD 5

你正在抛弃const char *(我们称之为不可修改的字符串)到char *(可修改的字符串)你丢弃const限定符.