zoukankan      html  css  js  c++  java
  • 第36课 经典问题(下)----关于string的疑问

    实例1:

    下面的代码输出什么,为什么?

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    
    int main()
    {
        string s = "12345";
        const char* p = s.c_str();//返回一个字符指针,这个字符指针就代表C语言中的字符串。
    
        cout << p << endl;
    
        s.append("abcde");
    
        cout << p << endl;
    
        return 0;
    }

    我们期望p最终为12345abcde,但是事与愿违,最终的打印结果是12345,为什么会这样呢?

    当向字符串的尾部插入一个新的字符串的时候,m_cstr指针就发生了改变。它将重新申请一片堆空间,并且将原来的字符串12345和新的要被插入到尾部的字符串abced一起复制到
    这片新的堆空间中去,以前的堆空间就会被释放,此时p指向了已经被释放的堆空间了,此时p就成为了野指针。

    实例程序二

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        const char* p = "12345";//使用指针p指向了一个字符串常量
        string s = "";//使用了C++标准库中的字符串类,此时就应该高度警惕了,bug随时可能会发生。
    
        s.reserve(10); //将字符串对象内部的数据指针所指向的堆空间大小变为10个字节
    
        // 不要使用 C 语言中的方式操作 C++ 中的字符串
        for(int i=0; i<5; i++)
        {
            s[i] = p[i];
        }
    
    
        if( !s.empty())
        {
            cout << s << endl;
        }
    
        return 0;
    }

    期望的结果是输出12345,但是输出是空,为什么?

     这个地方m_length始终为0,造成这个问题的原因就是混合使用C和C++,不要混合使用字符串指针和字符串对象。

  • 相关阅读:
    Link标签的media属性
    Moss2007ctx问题
    Moss2007 ListTemplate
    Html body的滚动条禁止与启用
    DOM的事件冒泡
    IE解析UL和LI的规则和问题
    AT&T汇编语言语法(一)(转)
    Linux 汇编语言开发指南 (转)
    Python 模块 jwt
    Excel2003和excel2007读取方法
  • 原文地址:https://www.cnblogs.com/-glb/p/11931559.html
Copyright © 2011-2022 走看看