覆盖钩子函数中的现有指针

时间:2015-03-14 16:18:52

标签: c++ arrays pointers char hook

我有一个小问题,我似乎无法弄明白。我已经挂钩了一个具有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);
    //..
}

现在,如果我保持新字符串的长度等于或小于旧字符串的长度,它确实有效。但如果我试图让它变大,它将无法工作。

我该怎么做?我的猜测是要在复制之前用新的长度重新分配缓冲区变量,但我不能让它以这种方式工作。

1 个答案:

答案 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;
}