pmg*_*pmg 15 c casting const undefined-behavior language-lawyer
想象一下,我有这个C函数(以及头文件中的相应原型)
void clearstring(const char *data) {
char *dst = (char *)data;
*dst = 0;
}
Run Code Online (Sandbox Code Playgroud)
有未定义行为在上面的代码,铸造const
走,或者是它只是一个非常不好的编程习惯?
假设没有使用const限定对象
char name[] = "pmg";
clearstring(name);
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 24
如果调用者向您传递指向const对象的指针或指向字符串文字的指针,则写入的尝试*dst
是UB .
但是如果调用者向您传递指向实际上是可变的数据的指针,则定义行为.创建const char*
指向可修改的内容char
并不会使其成为char
不可变的.
所以:
char c;
clearstring(&c); // OK, sets c to 0
char *p = malloc(100);
if (p) {
clearstring(p); // OK, p now points to an empty string
free(p);
}
const char d = 0;
clearstring(&d); // UB
clearstring("foo"); // UB
Run Code Online (Sandbox Code Playgroud)
也就是说,你的功能是非常不明智的,因为调用者很容易导致UB.但实际上可以将它与定义的行为一起使用.