代码之家  ›  专栏  ›  技术社区  ›  Tanuj

字符串::c_str查询

  •  6
  • Tanuj  · 技术社区  · 15 年前

    调用string::c_str()返回的指针指向哪里?在下面的代码片段中,我想我会给出一个分段错误,但它给出了正确的输出。如果string::c_str()返回的指针指向string对象中的内部位置,那么当函数返回并调用对象析构函数时,我将获得无效的内存访问。

    #include <iostream>
    #include <string>
    using namespace std;
    
    const char* func()
    {
        string str("test");
        return str.c_str();
    }
    
    int main()
    {
        const char* p = func();
        cout << p << endl;
        return 0;
    }
    
    Output: test
    Compiler: g++ 4.3.3
    Platform: ubuntu 2.6.28-19
    
    2 回复  |  直到 15 年前
        1
  •  14
  •   James McNellis    15 年前

    调用返回的指针在哪里 string::c_str() 指向?

    它指向内存中的某个位置,其中以空结尾的字符串包含 std::string 位于。

    标准::字符串 c_str() data() 再一次。

    c_str() 下一次你对 反对。

    我应该得到一个无效的内存访问。

        2
  •  2
  •   Merlyn Morgan-Graham    15 年前

    你希望这个打印出来什么?

    #include <iostream>
    #include <string>
    
    int main()
    {
      int* test = new int[20];
      test[15] = 5;
      std::cout << test[15] << "\n";
      delete[] test;
      std::cout << test[15] << "\n";
      return 0;
    }
    

    在VS2010的发布模式下,我得到了这样的结果:

    5个

    释放的内存在尝试访问时不一定抛出异常。这个值也不一定会被重写。(有趣的是,如果我将编译模式更改为调试模式,编译器将用 -572662307

    当您试图访问它时,标准没有定义它会发生什么。这意味着编译器可以做它想做的任何事情,或者选择什么都不做。(或者破坏你的程序,或者炸毁整个宇宙……)