下面的代码导致 g ++ 5.4.0 20160609 上的分段错误。但它适用于 vs c ++ 11.0 。
#include <string>
#include <iostream>
#include <vector>
struct fooStruct{
std::string str;
fooStruct() : str(std::string("")){}
};
int main()
{
fooStruct fooObj;
std::vector<char> cont(sizeof(fooStruct));
std::cout<<"Size of string = "<<sizeof(std::string)<<std::endl;
std::cout<<"Size of vec = "<<cont.size()<<std::endl;
std::cout<<sizeof(fooObj)<<std::endl;
char* ptr = cont.data();
((fooStruct*)(ptr))[0] = fooObj; //segmentation fault
//((fooStruct*)(ptr))[0].str = fooObj.str; //segmentation fault
std::cout<<((fooStruct*)(ptr))[0].str<<std::endl;
return 0;
}
编译器之间的唯一区别是msvc对于字符串采用 40 字节,而gcc仅 32 。但我不认为这在这里很重要。 为什么它在msvc上有效并且不能用于g ++?
答案 0 :(得分:2)
您的代码有未定义的行为。这意味着它可以&#34;工作&#34;或者它可能会爆炸,两者都是有效的结果。
ptr
指向一个char数组。它不代表fooStruct
。所以当你这样做时
((fooStruct*)(ptr))[0]
您将该内存视为fooStruct
,即使它不是未定义的行为。