考虑以下代码:
std::vector<std::string> foo{{"blee"}, {"bleck"}, {"blah0000000000000000000000000000000000000000000000000000000000000000000000000000000000"}};
std::string *temp = foo.data();
char*** bar = reinterpret_cast<char***>(&temp);
for (size_t i = 0; i < foo.size(); ++i){
std::cout << (*bar)[i] << std::endl;
}
显然这是粗略的代码,但它恰好可以工作。
http://ideone.com/2XAJYR http://ideone.com/2XAJYR
我想知道为什么它有效? C++ 有一些我不知道的奇怪规则吗?或者只是糟糕的代码和未定义的行为?
我将其中一个字符串设置得很大,以防进行一些小字符串优化。
改编自:将 std::string 向量转换为 char*** https://stackoverflow.com/questions/27687751/cast-a-vector-of-stdstring-to-char/29031944#29031944
这是非常不确定的行为。
如果字符串实现恰好包含指向字符串数据的指针作为其唯一的数据成员,那么它看起来会“工作”,因此数组string
与数组具有相同的内存布局char*
。至少一种流行的实现 (GNU) 就是这种情况,但肯定不是您可以依赖的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)