将char*传递给函数并在内存中覆盖它

Pass char* to function and overwrite it in memory

本文关键字:内存 覆盖 函数 char      更新时间:2024-09-28

我想把一个字符串(char*(传递给dll中的一个函数,用另一个字符串覆盖它。

文件dll.cpp

__declspec(dllexport) void getString(char *name, char *buffer, int len) {
std::string str = getString(); // buffer should be overwritten with this string
char *cstr = new char[str.length() + 1];
strcpy(cstr, str.c_str());
strncpy(buffer, cstr, len);
}

文件main.cpp

char *buffer;
getString("z", buffer, 128);      
printf("%s", buffer);

我不知道如何正确地传递缓冲区来覆盖它。

很明显,您对指针感到困惑。看起来您使用cstr是为了给buffer一些内存,但这不起作用,cstr是不必要的。

这是正确的代码,主要分配了buffer,而消除了cstr

char *buffer = new char[128];
getString("z", buffer, 128);      
printf("%s", buffer);
__declspec(dllexport) void getString(char *name, char *buffer, int len)
{
std::string str = getString();
strncpy(buffer, str.c_str(), len);
}

请注意,使用strncpy是一个危险的函数,因为它不能保证输出是nul终止的。我更喜欢看到这样的代码

__declspec(dllexport) void getString(char *name, char *buffer, int len)
{
if (len == 0)
{
// some kind of error handling
}
std::string str = getString();
strncpy(buffer, str.c_str(), len - 1);
buffer[len - 1] = '';
}