将ptr返回到堆栈缓冲区

时间:2015-06-30 14:46:03

标签: 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);
}

我的具体问题是关于函数返回的内容。 看起来它返回一个指向&#39;缓冲区&#39; 。哪个在堆栈上 - 对吧?

这不是问题吗?

3 个答案:

答案 0 :(得分:4)

是的,函数strerror_r使用buffer来存储消息并将其返回,但由于函数getErrnoString返回std::string,因此implicit conversion constructor是称为:

string::string(const char* data)

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

答案 1 :(得分:2)

上面的代码不会返回指向本地缓冲区的指针。它根本不会返回任何指针。它返回一个由std::string返回的char缓冲区构造的strerror_r对象。按值返回std::string个对象是完全安全的。

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

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

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

答案 2 :(得分:0)

返回从函数std::string

返回的strerror_r(errorNumber, buffer, maxLength);

您正在将指针传递给&#39;缓冲区&#39;作为strerror_rmaxlengtherrorNumber等其他参数一起运作的参数。