在没有堆的情况下返回 Char 指针

Returning Char Pointer Without Heap

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

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

如何在不使用堆的情况下 c_str() return 字符串,我能否以某种方式在我自己的代码中模仿同样的行为?

提前谢谢大家。

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

我不确定您想在自己的代码中模仿什么。

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

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

The pointer obtained from c_str() may be invalidated by:

  • Passing a non-const reference to the string to any standard library function, or
  • Calling non-const member functions on the string, excluding operator[], at(), front(), back(), begin(), rbegin(), end() and rend().

请注意,自 C++11 起,c_str()data() perform the same function, and it works similar to how std::vector's data() 成员有效。

这里是一个函数的例子return指向不是堆或栈的东西的指针:

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

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