真正自杀的人,大多数之前完全没想过自杀 2025-05-27 07:51:32
Linux 常用命令集合 2025-05-31 13:53:32
“一举两得”是哪“两得”? 2025-05-03 23:59:09
轮辋直径是什么意思? 2025-05-14 07:43:14
多方炮是什么意思?多方炮k线图分析 2025-05-19 00:32:12
怎样禁止电脑上传文件、禁止将电脑文件上传到网盘、禁止QQ发送电脑文件的方 2025-05-24 15:16:14
【科普】存档位置 2025-05-03 21:32:30
动物启蒙:鲨鱼🦈 2025-06-08 18:43:08
2018俄罗斯世界杯球场巡礼-喀山体育场 2025-05-10 11:18:41
报关单到底要在哪个平台打印?电子口岸?单一窗口?互联网+海关? 2025-05-15 09:11:20

C++ 中的 string 在内存中的位置

我们先不考虑 string 的实质是什么,先做一个实验。 执行如下代码:

int _tmain(int argc, _TCHAR* argv[])

{

string temp = "LYSM";

getchar();

return 0;

}

调试查看 temp 的地址: 修改代码为:

int _tmain(int argc, _TCHAR* argv[])

{

string temp = "LYSM|LYSM|LYSM|LYSM";

getchar();

return 0;

}

神奇,此时 temp 的内存地址中已经不会有 "LYSM|LYSM|LYSM|LYSM" 的字样了。这是因为当前的 temp 长度 > 16字节,(大于16字节的变量放在堆中存储,小于16字节的变量放在栈中存储)

😃 可以写代码验证一下:

int _tmain(int argc, _TCHAR* argv[])

{

string temp = "123456789012345"; // 长度15

int *a = (int *)malloc(sizeof(int)); // 通过 malloc 申请的内存位于堆中

int b = 0; // 通过编辑器初始化的内存位于栈中

for(auto &c:temp)

{

printf("c:%p\n", &c);

}

printf("a:%p\n", a);

printf("b:%p\n", &b);

getchar();

return 0;

}

将变量长度增加后:

int _tmain(int argc, _TCHAR* argv[])

{

string temp = "1234567890123456"; // 长度16

int *a = (int *)malloc(sizeof(int)); // 通过 malloc 申请的内存位于堆中

int b = 0; // 通过编辑器初始化的内存位于栈中

for(auto &c:temp)

{

printf("c:%p\n", &c);

}

printf("a:%p\n", a);

printf("b:%p\n", &b);

getchar();

return 0;

}

了解了这些我们大概就明白了。但是还有一点没有明了,那就是长度 > 16字节的 temp 怎么通过 &temp 去访问堆中的数据呢? 再次看一下之前的代码,下断点调试:

int _tmain(int argc, _TCHAR* argv[])

{

string temp = "LYSM|LYSM|LYSM|LYSM";

getchar();

return 0;

}

留意红框内的数值,它是一个地址:0x005d95b0,转到这个地址看一下发现我们想要的数据就在这里!

总结:

(1)string 类型小于16字节时内存位置为 变量内存地址+4。 (2)string 类型大于等于16字节时内存低地址为 [变量内存地址+4] ,也就是说原本存放在这里的数据变成了一个指针,32位进程(也就是我的)指针大小为4字节,64位进程指针大小为8字节。