当给定`const char *`作为第一个参数时,C标准库函数`strchr`如何返回指向非const的指针?
使用gcc / g ++编译给定代码示例成功。 strchr
调用没有错误,这显然将const char *
赋予char *
。
我发现strchr
在两个不同的源pubs.opengroup.org和cplusplus.com上声明为char * strchr(const char *, int)
如果strchr
被实现为抛弃strchr
,那为什么会这样呢?
如果目标是提供对char *
和const char *
字符串都有效的函数 – 它可以使用两个不同的函数名实现。
你能否对此作出更全面的解释?
#include 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 to *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
。