没有堆的返回字符指针

时间:2015-02-19 00:57:36

标签: c++ pointers std cstring stdstring

我正在制作一个程序,我注意到一些对我来说没有多大意义的东西。 std::string有一个名为c_str()的函数,它返回std::string对象的C风格字符串(以NULL结尾)表示。对我来说没有意义的是c_str()函数如何在不将其分配给堆的情况下返回const char *。该函数似乎返回堆栈上的char数组。

我一直认为函数只能返回一个有效的指针,如果它指向的值是使用像malloc()calloc()这样的函数在堆上分配的。

c_str()如何在不使用堆的情况下返回字符串,我可以在自己的代码中以某种方式模仿这种相同的行为吗?

提前谢谢大家。

3 个答案:

答案 0 :(得分:2)

指针可以指向任何变量,无论是在堆还是堆栈上。 c_str返回指向字符串对象内部缓冲区的指针。通常这是在堆上,但是一些编译器可以自行决定将小字符串的数据放在堆栈上。但是,您如何知道返回的指针位于堆栈而不是堆?

我不确定你想要在你自己的代码中模仿到底是什么。

答案 1 :(得分:1)

c_str()返回的指针实际上是一个内部指针,指向字符串缓冲区的内存(已经在堆上分配)。这样就不必分配任何(新的)内存。内存已经分配,​​是字符串对象存储数据的方式。

这就是c_str()返回的指针是invalid after modifying the string的原因:因为它指向内部缓冲区,所以在操作之后该缓冲区可能不再有效。

  

从c_str()获得的指针可以通过以下方式无效:

     
      
  • 将对字符串的非const引用传递给任何标准库函数,或
  •   
  • 在字符串上调用非const成员函数,不包括operator [],at(),front(),back(),begin(),rbegin(),end()和rend()。
  •   

请注意,由于C ++ 11,c_str()data()执行相同的功能,它的工作方式与std::vector data()成员的工作方式类似。

答案 2 :(得分:0)

这是一个函数返回指向不是堆或堆栈的指针的示例:

char const * Hello(void)
{
  static const char hello_text[] = "Hello";
  return &hello_text[0];
}

因为变量声明为static,所以变量将在执行离开函数后存在。因此,返回指向此值的指针是完全有效的。