当给定`const char*`作为第一个参数时,C标准库函数`strchr`为什么会返回指向非常量的指针?

当给定`const char*`作为第一个参数时,C标准库函数`strchr`为什么会返回指向非常量的指针?,c,gcc,constants,strchr,C,Gcc,Constants,Strchr,使用gcc/g++编译给定代码示例成功。strchr调用没有错误,它显然将const char*赋值给char* 我发现strchr被声明为char*strchr(const char*,int)在两个不同的源和 如果strchr的strchr是为了抛弃常量而实现的,那么为什么会这样呢 如果目标是提供同时在char*和const char*字符串上工作的函数,则可以使用两个不同的函数名来实现 你能更详细地解释一下吗 #include <string.h> int main () {

使用gcc/g++编译给定代码示例成功。
strchr
调用没有错误,它显然将
const char*
赋值给
char*

我发现
strchr
被声明为
char*strchr(const char*,int)
在两个不同的源和

如果strchr的
strchr
是为了抛弃常量而实现的,那么为什么会这样呢

如果目标是提供同时在
char*
const char*
字符串上工作的函数,则可以使用两个不同的函数名来实现

你能更详细地解释一下吗

#include <string.h>

int main () {
    const char *str = "Sample string";
    char * ptr;

    //ptr = str;            //  Error: discards const qualifier - both on gcc and g++
    pch = strchr(str,'S');  //  Succeeds in assigning <const char *> to <char *>

    *pch = '4';             //  Runtime error: segmentation fault

    return 0;
}
#包括
int main(){
const char*str=“示例字符串”;
char*ptr;
//ptr=str;//错误:丢弃常量限定符-在gcc和g上++
pch=strchr(str,'S');//成功分配给
*pch='4';//运行时错误:分段错误
返回0;
}

使用MSYS2/mingw-w64 gcc_v5.3.0和TDM-gcc32 v5.1.0在Win7上尝试了它。

当您使用
char*
调用
strchr
时,您需要返回
char*
以便不需要对结果进行强制转换。C不支持函数重载,因此相同的
strchr
函数用于在
char*
const char*
中搜索。在所有情况下,它都返回一个非常量指针。如果使用
const char*
调用它,基本上就是丢弃
const
,因此安全使用它是调用方的责任(例如,立即将结果分配给
const char*
,以避免不安全地使用返回的指针)

若目标是提供同时在char*和const char*字符串上工作的函数,那个么它可以使用两个不同的函数名来实现

是的,本来可以,但不是那样做的。C的原始版本根本不支持
const
,因此程序员总是有责任避免试图修改字符串文本。如果使用不同的函数名,那么它将破坏安全使用
strchr
的现有代码。如果像这样的传统C代码突然停止编译,则会减慢新的
const
关键字的采用:

char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';
“C的精神”是它不会试图阻止你做不安全的事情,你的工作是编写正确的代码

<> > C++ >代码> Strucr 重载以保持常态:

char* strchr(char*, int);
const char* strchr(const char*, int);
这意味着它会自动执行正确的操作,而且使用
strchr

可能重复的