C++ 将ptr返回堆栈缓冲区

C++ 将ptr返回堆栈缓冲区,c++,C++,我遇到了以下函数: #include <string.h> using namespace std; std::string getErrnoString(const int errorNumber) { const int maxLength = 256; char buffer[maxLength]; return strerror_r(errorNumber, buffer, maxLength); } #包括 使用名称空间std; std::st

我遇到了以下函数:

#include <string.h>
using namespace std;


std::string getErrnoString(const int errorNumber)
{
    const int maxLength = 256;
    char buffer[maxLength];
    return strerror_r(errorNumber, buffer, maxLength);
}
#包括
使用名称空间std;
std::string getErrnoString(const int errorNumber)
{
常量int maxLength=256;
字符缓冲区[maxLength];
返回strerror\u r(错误号、缓冲区、最大长度);
}
我的具体问题是关于函数返回什么。 它看起来像是返回一个指向“buffer”的指针。哪一个在堆栈上-对吗


这不是一个问题吗?

它返回一个从函数
strerror\r(errorNumber,buffer,maxLength)返回的
std::string


您正在将指向“buffer”的指针作为参数传递给函数
strerror\r
,其他参数如
maxlength
errorNumber

是的,函数
strerror\r
使用
buffer
存储并返回消息,但是由于函数
getErrnoString
返回一个
std::string
,因此调用:

string::string(const char* data)

此构造函数将数据从传递的指针复制到
std::string
本身的内部缓冲区,因此没有问题,因为您随后返回了存储在
std::string
中的缓冲区副本,并按值返回。

上述代码不会返回指向本地缓冲区的指针。它根本不返回任何指针。它返回一个
std::string
对象,该对象由
strerror\u r
返回的字符缓冲区构造而成。按值返回
std::string
对象是完全安全的

此函数中的
return
语句执行到
std::string
类型的隐式转换。在显式形式中,它将如下所示

return std::string(strerror_r(errorNumber, buffer, maxLength));

请注意,上述代码中使用的特定于GNU版本的
strerror\r
并不保证函数将使用用户提供的缓冲区。允许函数返回指向系统缓冲区的指针,而不使用用户提供的缓冲区。但在一般情况下,用户必须假设用户提供的缓冲区将用于字符串。

函数似乎至少有两个版本,返回int或char*: