繁体   English   中英

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

[英]How come C standard library function `strchr` returns pointer to non-const, when given `const char *` as first argument?

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

我发现strchr在两个不同的源pubs.opengroup.orgcplusplus.com上声明为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;
}

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

当你使用char*调用strchr ,你想要一个char* ,这样你就不需要对结果进行strchr了。 C不支持函数重载,因此使用相同的strchr函数在char*const char*进行搜索。 它在所有情况下都返回一个非const指针。 如果你用const char*调用它,它基本上抛弃了const因此调用者有责任安全地使用它(例如,通过立即将结果赋值给const char* ,以避免任何不安全的使用返回的指针)。

如果目标是提供对char *和const char *字符串都起作用的函数 - 它可以使用两个不同的函数名实现。

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

char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';

“C的精神”是它不会试图阻止你做不安全的事情,编写正确的代码是你的工作。

在C ++中, strchr被重载以保留strchr

char* strchr(char*, int);
const char* strchr(const char*, int);

这意味着它会自动执行正确的操作,并且使用strchr意外编写不安全的代码要困难strchr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM