想象一下,我有这个C函数(以及头文件中的相应原型)
void clearstring(const char *data) {
char *dst = (char *)data;
*dst = 0;
}
上面的代码中是否存在未定义的行为,将const
抛弃,或者它只是一个非常糟糕的编程习惯?
假设没有使用const限定对象
char name[] = "pmg";
clearstring(name);
答案 0 :(得分:24)
写入*dst
的尝试是UB ,如果调用者将指针传递给const对象或指向字符串文字的指针。
但是如果调用者通过指向实际上可变的数据的指针,那么就定义了行为。创建指向可修改const char*
的{{1}}不会使char
不可变。
所以:
char
也就是说,你的功能非常不明智,因为调用者很容易导致UB。但实际上可以将它与定义的行为一起使用。
答案 1 :(得分:0)
考虑像strstr
这样的函数,如果给出指向包含字符串的对象的一部分的指针,则返回指向同一对象的可能不同部分的指针。如果该方法被传递给指向只读存储区的指针,它将返回一个指向只读存储区的指针;同样,如果给出一个指向可写区域的指针,它将返回一个指向可写区域的指针。
C中没有办法让函数在给定const char *
时返回const char *
,并在给定普通char *
时返回普通char *
。为了与strstr
在将const char *
的概念添加到语言之前的工作方式兼容,它必须将const限定的指针转换为非const限定的指针。虽然由于库函数strstr
可能有权进行此类转换,即使用户代码不能,但是在用户代码中经常会出现相同的模式,因此禁止使用它。