使用 gcc/g++ 成功编译给定的代码示例。没有错误strchr
调用,这显然分配了const char *
to char *
.
我发现了strchr
被声明为char * strchr(const char *, int)
在两个不同的来源pubs.opengroup.org http://pubs.opengroup.org/onlinepubs/7908799/xsh/strchr.html and cplusplus.com http://www.cplusplus.com/reference/cstring/strchr/
If strchr
是为了抛弃常量而实现的,那么为什么会这样呢?
如果目标是提供同时适用于char *
and 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 上尝试过。
你打电话时strchr
with a char*
你想要一个char*
返回,这样您就不需要对结果进行强制转换。 C不支持函数重载,所以同样的strchr
函数用于在a中进行搜索char*
并在一个const char*
。在所有情况下它都会返回一个非常量指针。如果你用一个来调用它const char*
它基本上抛弃了const
因此调用者有责任安全地使用它(例如,将结果分配给const char*
立即,以避免对返回指针的任何不安全使用)。
如果目标是提供同时适用于 char * 和 const char * 字符串的函数 - 它可以使用两个不同的函数名称来实现。
是的,本来可以,但事实并非如此。原来的C版本不支持const
根本没有,所以程序员有责任避免尝试修改字符串文字。如果使用不同的函数名称,那么它将破坏使用的现有代码strchr
安全。这会减慢新产品的采用速度const
关键字如果像这样的传统 C 代码突然停止编译:
char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';
“C 的精神”是它不会试图阻止你做不安全的事情,编写正确的代码是你的工作。
In C++ strchr
被重载以保持常量:
char* strchr(char*, int);
const char* strchr(const char*, int);
这意味着它会自动做正确的事情,并且更难意外地编写不安全的代码strchr
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)