Where is the undefined behavior when using const_cast<>?

时光怂恿深爱的人放手 提交于 2019-12-01 16:38:45

问题


If I do:

const char* const_str = "Some string";

char* str = const_cast<char*>(const_str); // (1)

str[0] = "P"; // (2)

Where (which line) exactly is the undefined behavior ?

I've been searching a lot for this on SO but haven't found any explicit and precise answer (or at least, none that I could understand).

Also related: if I use an external library which provides this kind of function:

// The documentation states that str will never be modified, just read.
void read_string(char* str);

Is it ok to write something like:

std::string str = "My string";

read_string(const_cast<char*>(str.c_str()));

Since I know for sure that read_string() will never try to write to str ?

Thank you.


回答1:


Line (2) has undefined behaviour. The compiler is at liberty to place constants in read-only memory (once upon a time in Windows this would have been a "data segment") so writing to it might cause your program to terminate. Or it might not.

Having to cast const-ness away when calling a poorly-defined library function (non-const parameter which should be const) is, alas, not unusual. Do it, but hold your nose.




回答2:


You are attempting to modify a constant string which the compiler may have put into a read-only section of the process. This is better:

char str[32];
strcpy(str, "Some string");
str[0] = "P";


来源:https://stackoverflow.com/questions/5535863/where-is-the-undefined-behavior-when-using-const-cast

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!