Java教程

STL容器之string内存重定义--???

本文主要是介绍STL容器之string内存重定义--???,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

修改string字符串的内容,下标操作符[]和at都会返回字符的引用。但当字符串的内存被重新分配之后,可能发生错误

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <string>

void test01()
{
    string s = "abcd";
    char& a = s[2]; //此时取到的是abcdef时的内存地址
    char& b = s[3];
    a = '1';
    b = '2';
    cout << s << endl;
    cout << (int*)s.c_str() << endl;    //获取abcdef时的内存地址

    s = "pppppppppppp";     //此时内存地址可能改变
    a = '1';    //因为原地址没有被改变  所以可以运行
    b = '2';
    cout << s << endl;
    cout << (int*)s.c_str() << endl;    //获取ppppppppppppppp时的内存地址

    s = "ppppppppppppppp啊啊啊啊啊啊啊";      //此时s的内存地址发生改变 指向ppppppppppppppp啊啊啊啊啊啊啊的内存地址
   
    a = '1';    //因为原地址被改变 a指向的还是原来的地址 已经失效的地址 没有指针指向的地址 所以error
    b = '2';
    cout << s << endl;
    cout << (int*)s.c_str() << endl;    //获取ppppppppppppppp啊啊啊啊啊啊啊时的内存地址
}
int main()
{
    test01();
    system("Pause");
    return 0;
}

结果:

 

结果可以看出 ,第一次改变s字符串的时候并没有引发内存重新分配,所以内存地址相同,a和b能改变字符串的数值

而s第二次改变数值时引发了错误

先不修改 a和b的数值 看下内存地址

 

 结果:

 

可以看出 前两次内存一致,第三次内存地址发生改变

这篇关于STL容器之string内存重定义--???的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!