我正在开发一个项目,在我的一个函数中,我需要返回一个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;
}
答案 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;
}
上述代码有些变体,例如
buflen==0
,则仅返回要复制的字符总数。这允许客户端调用您的函数来获取字符数,然后再次调用它
适当大小的缓冲区。答案 2 :(得分:0)
谢谢大家,它的确有效 我使用过PaulMcKenzie的方法,它很棒! 我没有尝试过Nikerboker的解决方案,所以也许它也可以。
由于