C 更改作为void*函数参数传递的变量的地址

C 更改作为void*函数参数传递的变量的地址,c,C,我有一个回调函数void string\u cb(char*data,size\t size,void*str)它使用一个原型void callback\u decl(char*data,size\t size,void*ret\val),其中最后一个参数是返回值。因为我的回调需要为带有malloc()的字符串分配内存,所以我需要将void*str的地址更改为已分配内存块。是否可以在不更改回调原型的情况下为str分配新地址?是的,您可以。。。但不能使用您的字符串\u cb声明。如果希望能够返回新

我有一个回调函数
void string\u cb(char*data,size\t size,void*str)
它使用一个原型
void callback\u decl(char*data,size\t size,void*ret\val)
,其中最后一个参数是返回值。因为我的回调需要为带有
malloc()
的字符串分配内存,所以我需要将
void*str
的地址更改为已分配内存块。是否可以在不更改回调原型的情况下为str分配新地址?

是的,您可以。。。但不能使用您的
字符串\u cb
声明。如果希望能够返回新分配数组的地址,则需要一个
char**
作为最后一个参数:

void slbin_handler_nstring(char* data, size_t data_size, void* ret_ptr) {
    char** ptr = (char **) ret_ptr;
    *ptr = malloc(data_size);
    if (!(*ptr)) return;
    memcpy(*ptr, data, data_size);
}
如果应该这样称呼:

char *ptr;
slbin_handler_nstring(data, data_size, &ptr) ;

是的,你可以。。。但不能使用您的
字符串\u cb
声明。如果希望能够返回新分配数组的地址,则需要一个
char**
作为最后一个参数:

void slbin_handler_nstring(char* data, size_t data_size, void* ret_ptr) {
    char** ptr = (char **) ret_ptr;
    *ptr = malloc(data_size);
    if (!(*ptr)) return;
    memcpy(*ptr, data, data_size);
}
如果应该这样称呼:

char *ptr;
slbin_handler_nstring(data, data_size, &ptr) ;

使用签名
void callback\u decl(char*data,size\t size,void*ret\u val)
,调用者全权负责提供分配的内存。调用的回调不可能在内部分配内存

如果您想一想,这实际上是首选,因为调用者更清楚应该在哪里分配内存(堆或堆栈),并且可以完全控制字符串的整个生命周期


通常,此模式与
ret\u val
的一个特殊值相结合,该值表示提供的缓冲区太小,以便调用者可以再次发出回调,但缓冲区较大。

带有签名
void callback\u decl(char*data,size\t size,void*ret\u val)
,调用者只负责提供分配的内存。调用的回调不可能在内部分配内存

如果您想一想,这实际上是首选,因为调用者更清楚应该在哪里分配内存(堆或堆栈),并且可以完全控制字符串的整个生命周期


通常,此模式与
ret_val
的一个特殊值相结合,表示提供的缓冲区太小,因此调用者可以再次发出回调,但缓冲区较大。

您能提供更多详细信息吗?我想你是在把这个回调传递给某个库?如果是,指向哪个库以及其中的哪个函数?这取决于在该参数中实际传递的内容。如果调用方传入一个
char**
,则可以返回新分配的内存。你必须提供更多的上下文。提供callback_decl和string_cb的代码,只提供你用于回调的部分,并清除内存问题?很难理解你在做什么;“你在试着去做。”雷亚德更新了一个显然行不通的问题。正如我所说,如果调用方传入一个双指针,那么您可以执行如下操作:
char**ret=ret\u ptr*ret=malloc()。因此,调用方和回调函数之间需要有一个理解。否则是不可能的。你能提供更多的细节吗?我想你是在把这个回调传递给某个库?如果是,指向哪个库以及其中的哪个函数?这取决于在该参数中实际传递的内容。如果调用方传入一个
char**
,则可以返回新分配的内存。你必须提供更多的上下文。提供callback_decl和string_cb的代码,只提供你用于回调的部分,并清除内存问题?很难理解你在做什么;“你在试着去做。”雷亚德更新了一个显然行不通的问题。正如我所说,如果调用方传入一个双指针,那么您可以执行如下操作:
char**ret=ret\u ptr*ret=malloc()。因此,调用方和回调函数之间需要有一个理解。否则这是不可能的。@Sergerbalesta,是的,我试图在回调方法之后调用put(ptr),得到segfault。@iTs.SL4y3R:我在您的评论之后测试了它,它确实出现了segfault,但这是由我的代码中的大量输入错误造成的。我已经修复了它们,现在可以正常工作了。@Sergerbalesta,是的,我尝试在回调方法之后调用puts(ptr),得到了segfault。@iTs.SL4y3R:我在你的评论后测试了它,它确实出现了segfault,但这是由我的代码中的大量输入错误造成的。我已经修复了它们,现在它可以正常工作了。