如果我这样做:
const char* const_str = "Some string";
char* str = const_cast<char*>(const_str); // (1)
str[0] = "P"; // (2)
哪个(哪一行)确实是未定义的行为?
我一直在搜索这个问题,但没有找到任何明确而准确的答案(或者至少没有我能理解的答案)。
还相关:如果我使用提供此类功能的外部库:
// The documentation states that str will never be modified, just read.
void read_string(char* str);
可以写出类似的内容:
std::string str = "My string";
read_string(const_cast<char*>(str.c_str()));
因为我确信read_string()
永远不会尝试写入str
?
谢谢。
答案 0 :(得分:9)
第(2)行有未定义的行为。编译器可以自由地将常量放在只读存储器中(在Windows中曾经是一个“数据段”),因此写入它可能会导致程序终止。或者它可能不会。
当调用定义不明确的库函数(非const参数,应该是const)时,必须抛弃const-ness,唉,并不罕见。做,但抓住你的鼻子。
答案 1 :(得分:-1)
您正在尝试修改编译器可能已放入进程的只读部分的常量字符串。这样更好:
char str[32];
strcpy(str, "Some string");
str[0] = "P";