我正在制作一个程序,我注意到一些对我来说没有多大意义的东西。 std::string
有一个名为c_str()
的函数,它返回std::string
对象的C风格字符串(以NULL结尾)表示。对我来说没有意义的是c_str()
函数如何在不将其分配给堆的情况下返回const char *
。该函数似乎返回堆栈上的char数组。
我一直认为函数只能返回一个有效的指针,如果它指向的值是使用像malloc()
或calloc()
这样的函数在堆上分配的。
c_str()
如何在不使用堆的情况下返回字符串,我可以在自己的代码中以某种方式模仿这种相同的行为吗?
提前谢谢大家。
答案 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
,所以变量将在执行离开函数后存在。因此,返回指向此值的指针是完全有效的。