指针转换

时间:2018-03-22 15:28:41

标签: c++ visual-studio gcc

下面的代码导致 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 ++?

1 个答案:

答案 0 :(得分:2)

您的代码有未定义的行为。这意味着它可以&#34;工作&#34;或者它可能会爆炸,两者都是有效的结果。

ptr指向一个char数组。它不代表fooStruct。所以当你这样做时

((fooStruct*)(ptr))[0]

您将该内存视为fooStruct,即使它不是未定义的行为。