谈结构体中std::string所占的空间

C++结构体内存布局

#include <string>

#include <iostream>

 

 

struct  test

{

int iID;

int iType;

std::string strName;

int iLevel;

 

 

test()

{

iID = 2;

iType = 2;

iLevel = 2;

strName = "Hello, world";

}

};

 

 

void Output(test& stTest)

{

char * pID = (char*)(&stTest);

 

cout << (int)(*pID) << endl;

 

cout << (int)(*(pID+sizeof(int))) << endl;

 

 

std::string *pName = (std::string *)(pID+sizeof(int) + sizeof(int));

 

cout << *pName << endl;

 

*pName = "hello";

 

cout << (int)(*(pID+sizeof(int) + sizeof(int)+sizeof(std::string))) << endl;

 

}

 

 

int main()

{

test stTest;

 

cout << sizeof(stTest) << endl;

 

Output(stTest);

Output(stTest);

}

 

结果如下:

 

40

2

2

Hello, world

2

2

2

hello

2

 

通过实验标明,string在结构体中只占用 sizeof(std::string)个字节,不会因为其中的内容长短而有所变化,

可见其中的内容是另一块存储区,本地只保存一个地址作为索引。

 

在使用 Visual Studio 2022 和 Qt 5.15.2 开发过程中,如果遇到打印结构体中 `std::string` 参数出现乱码的问题,通常涉及编码格式的处理不当。Qt 默认使用 Unicode 编码(UTF-16),而 `std::string` 使用的是本地多字节编码(如 GBK 或 UTF-8),因此在转换时可能出现字符集不匹配的情况。 以下是几种可能的解决方法: ### 1. 使用 `QString::fromStdString()` 转换并指定编码 可以将 `std::string` 显式地转换为 `QString`,并确保字符串以正确的编码格式显示。若系统默认编码是 UTF-8,则可以直接通过 `QString::fromStdString()` 进行转换[^1]: ```cpp std::string str = "测试文本"; qDebug() << QString::fromStdString(str); ``` 如果默认编码不是 UTF-8(例如 Windows 系统上通常使用 GBK/GB2312),则需要先将 `std::string` 转换为 UTF-8 或其他支持的编码格式再进行转换。 ### 2. 使用 `QTextCodec` 设置编码 为了适配非 UTF-8 的编码格式,可以通过 `QTextCodec` 来明确指定当前 `std::string` 的编码方式。例如,在中文 Windows 环境下,可使用 `codecForLocale()` 方法处理本地编码[^1]: ```cpp #include <QTextCodec> std::string str = "测试文本"; QTextCodec *codec = QTextCodec::codecForLocale(); qDebug() << codec->toUnicode(str.c_str()); ``` ### 3. 手动转为 UTF-8 格式 如果已知 `std::string` 中的数据是某种特定编码(例如 GBK),可以通过第三方库(如 `iconv`)或手动转换为 UTF-8 编码后再传递给 Qt 处理: ```cpp #include <QTextStream> #include <iconv.h> std::string gbkToUtf8(const std::string& strGBK) { iconv_t cd = iconv_open("UTF-8", "GBK"); if (cd == nullptr) return ""; size_t inBytesLeft = strGBK.size(); size_t outBytesLeft = inBytesLeft * 4; std::string strUTF8(outBytesLeft, '\0'); char* inBuf = const_cast<char*>(strGBK.data()); char* outBuf = &strUTF8[0]; if (iconv(cd, &inBuf, &inBytesLeft, &outBuf, &outBytesLeft) == static_cast<size_t>(-1)) { iconv_close(cd); return ""; } iconv_close(cd); strUTF8.resize(strUTF8.size() - outBytesLeft); return strUTF8; } std::string str = "测试文本"; // 假设该字符串为 GBK 编码 qDebug() << QString::fromStdString(gbkToUtf8(str)); ``` ### 4. 配置项目默认编码 确保整个项目的源代码文件保存为 UTF-8 编码,并且在编译器设置中启用 UTF-8 支持。对于 Visual Studio 2022,可以在菜单栏选择“文件”>“高级保存选项”,然后选择 UTF-8 编码格式保存文件。 ### 示例:完整的调试输出结构体中的 `std::string` 以下是一个完整的示例,展示如何正确打印包含 `std::string` 的结构体内容: ```cpp #include <QDebug> #include <QTextCodec> #include <string> struct Person { std::string name; int age; }; int main() { Person p; p.name = "张三"; // 假设此字符串为本地编码 p.age = 25; QTextCodec *codec = QTextCodec::codecForLocale(); qDebug() << "Name:" << codec->toUnicode(p.name.c_str()) << ", Age:" << p.age; return 0; } ``` 通过以上方法,可以有效解决 `std::string` 在 Qt 中显示乱码的问题,同时提高程序对不同编码环境的兼容性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值