我有一个小问题,我似乎无法弄明白。我已经挂钩了一个具有char*
参数的函数,对于记录,钩子正在工作。在我自己的函数内部,我想将char指针参数更改为我自己的函数。
int Foo(char *buffer, int length)
{
//..
std::string cString(buffer);
// some changes are made to cString here
length = cString.length();
memcpy(buffer, cString.c_str(), length);
//..
}
现在,如果我保持新字符串的长度等于或小于旧字符串的长度,它确实有效。但如果我试图让它变大,它将无法工作。
我该怎么做?我的猜测是要在复制之前用新的长度重新分配缓冲区变量,但我不能让它以这种方式工作。
答案 0 :(得分:4)
这根本不是C风格的字符串(char*
)的工作原理。你问的是不可能的。
您应该将C字符串视为第一个字符的内存地址。负责从该地址开始的内存块大小的人是您的呼叫者。你无法改变那里的内存大小。
举个例子,假设某人给你他们家的地址,并要求你填写1000把椅子。这是不可能的,1000把椅子不适合房子里面,你不能把它们放到邻居的房子里。你也不能让房子变大,因为这意味着房子会与邻居家重叠。
你可以做的是分配新内存(在新位置新建一所房子),用更大的数据填充(用1000把椅子填满房子),然后返回地址新字符串(给回房子的地址)。请记住通知您的来电者,他们现在有责任在完成房屋时将房屋毁坏。
一种方法是通过指向字符串:
void f(const char* str, char** out) {
int len = strlen(str);
char* new_str = malloc(strlen + 5 + 1);
strcpy(new_str, str);
strcat(new_str + len, "world");
*out = new_str;
}
int main(int argc, char** argv) {
const char str[] = "hello ";
char* new_str;
f(str, &new_str);
printf("%s\n", new_str);
free(new_str);
return 0;
}