gpt4 book ai didi

c++ - 指针转换后在 std::vector 中处理 std::string 时出现段错误

转载 作者:行者123 更新时间:2023-11-28 01:35:33 29 4
gpt4 key购买 nike

以下代码会导致 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++ 上不工作?

最佳答案

您的代码有未定义的行为。这意味着它可能会“起作用”,也可能会爆炸,两者都是有效的结果。

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

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

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

关于c++ - 指针转换后在 std::vector<char> 中处理 std::string 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49432572/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com