返回char *变量的地址

时间:2015-03-07 17:58:40

标签: c++ string char

我正在开发一个项目,在我的一个函数中,我需要返回一个char*变量的地址。 或者也许最好返回我的字符串的地址,但我不知道该怎么做。

这是我的代码:

const char* rogner(){

    int tableauXY[2];

    tableauXY[0]=5;
    tableauXY[1]=8;

    string valeurs=to_string(tableauXY[0])+";"+to_string(tableauXY[1]);

    const char* val1=valeurs.c_str();
    return val1;
}

3 个答案:

答案 0 :(得分:0)

有几种方法可以从extern“C”函数中导出字符串:

1)提供释放内存分配的第二种方法:

extern "C" const char* getStr(...)
{
  auto result = new char[N];
  ...
  return result;
}
extern "C" void freeStr(const char* str)
{
   delete[] const_cast<char*>(str);
}

2)使用OS分配器,例如在Windows的情况下:

// Client must call SysFreeString later
extern "C" const char* getStr(...)
{
  auto result = SysAllocString(N);
  ...
  return result;
}

3)使用客户端提供的缓冲区(如何告诉客户端缓冲区的大小应该有很多变化)。

extern "C" int getStr(char* buffer, int bufSize, ...){}

答案 1 :(得分:0)

您的问题有很多答案。但是不能做的一件事就是返回局部变量的地址。返回局部变量的地址是未定义的行为,所以完全忘记该选项。

由于您声明该函数是DLL的一部分,因此最好使用“标准”方法来处理DLL和客户端应用程序之间的字符串。

一种常用且广泛使用的方法是让客户端创建char缓冲区,并将char缓冲区传递给您。然后,您的函数将使用该信息填充用户提供的缓冲区。还可以传递可选项,例如缓冲区的大小。

上面的方法被Windows API中的大多数函数使用,需要传递和返回字符串。

这是一个小例子:

#include <algorithm>
//...
char *rogner(char *buffer, int buflen)
{
    int tableauXY[2];
    tableauXY[0]=5;
    tableauXY[1]=8;

    string valeurs=to_string(tableauXY[0])+";"+to_string(tableauXY[1]);

    // get length of buffer and make sure we copy the correct
    // number of characters
    size_t minSize = std::min(buflen, valeurs.length());
    const char* val1=valeurs.c_str();
    memcpy(buffer, val1, minSize);

    // return the user's buffer back to them.
    return buffer;
}

上述代码有些变体,例如

  1. 返回复制的字符数而不是原始缓冲区。
  2. 如果buflen==0,则仅返回要复制的字符总数。这允许客户端调用您的函数来获取字符数,然后再次调用它 适当大小的缓冲区。

答案 2 :(得分:0)

谢谢大家,它的确有效 我使用过PaulMcKenzie的方法,它很棒! 我没有尝试过Nikerboker的解决方案,所以也许它也可以。

由于