在没有堆的情况下返回 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指向该值的指针是完全有效的。
我正在编写一个程序,我注意到一些对我来说并没有多大意义的东西。 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指向该值的指针是完全有效的。