2016-01-17 22 views
3

使用gcc/g ++编写指定代码示例成功。 strchr呼叫没有错误,这显然将const char *改为char *当给定const char *作为第一个参数时,C标准库函数`strchr`如何返回指向非const的指针?

我发现strchr被声明为char * strchr(const char *, int)在两个不同的来源pubs.opengroup.orgcplusplus.com

如果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的。

+0

[strchr实现如何工作]的可能的副本(http://stackoverflow.com/questions/14367727/how-does-strchr-implementation-work) – Kninnug

回答

8

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

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

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

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

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

在C++ strchr超载保持常量性:

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

这意味着它会自动做正确的事,这是更难意外写不安全的代码strchr

相关问题