zoukankan      html  css  js  c++  java
  • 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的数值 看下内存地址

     结果:

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

    案例:大小写转换

    void test02()
    {
        //全变大写字母
        string str = "AbcDeF";
        for (int i = 0; i < str.size(); i++)
        {
            str[i] = toupper(str[i]);
        }
        cout << str << endl;
    }
  • 相关阅读:
    建站两个月,说说我的想法
    我见过的郭弃疾先生(兰亭集势CEO)
    C#数组和集合互相转换的几种方法的效率分析
    (五)React Ant Design Pro + .Net5 WebApi:后端环境搭建Autofac注入+ 泛型仓储
    关于C++中对私有的测试总结
    uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型(转)
    GDB调试
    linux删除乱码文件
    转:C++ nan
    vim
  • 原文地址:https://www.cnblogs.com/yifengs/p/15189152.html
Copyright © 2011-2022 走看看