第36课 经典问题(下)----关于string的疑问

Posted -glb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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++,不要混合使用字符串指针和字符串对象。

以上是关于第36课 经典问题(下)----关于string的疑问的主要内容,如果未能解决你的问题,请参考以下文章

第12课 经典问题解析一

第24课 经典问题解析二

第55课 经典问题解析

C++--第14课 - 专题二经典问题解析

20175305张天钰 《java程序设计》第四周课下测试总结

第50课 文本编辑器项目持续开发