将 char* 传递给函数并在内存中覆盖它
Pass char* to function and overwrite it in memory
我想将字符串 (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
在main中分配,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] = '[=11=]';
}
我想将字符串 (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
在main中分配,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] = '[=11=]';
}