如果我这样做:
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
?
谢谢你。
第 (2) 行具有未定义的行为。编译器可以自由地将常量放入只读内存中(曾经在 Windows 中这将是一个“数据段”),因此写入它可能会导致程序终止。或者可能不会。
当调用一个定义不明确的库函数(应该是 const 的非 const 参数)时,不得不放弃 const 性,唉,这并不罕见。做吧,但要捂住鼻子。
您正在尝试修改编译器可能已将其放入进程的只读部分中的常量字符串。 这样更好:
char str[32];
strcpy(str, "Some string");
str[0] = "P";