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;
    }
  • 相关阅读:
    埋点
    go 搭建web服务
    go的常见操作
    Zeus资源调度系统介绍
    支付系统中热点账户的性能问题
    redis
    集成Spring-Boot与gRPC,grpc-spring-boot-starter
    Spring Cloud灰度发布之Nepxion Discovery
    Spring Cloud Stream
    通过消息总线Spring Cloud Bus实现配置文件刷新(使用Kafka或RocketMQ)
  • 原文地址:https://www.cnblogs.com/yifengs/p/15189152.html
Copyright © 2011-2022 走看看