如何正确处理c中函数分配和交换的缓冲区

如何正确处理c中函数分配和交换的缓冲区,c,buffer,C,Buffer,我在dll中调用导出的函数,不知道是否正确。我总是在主机和库函数之间传递(void*)。在主机应用程序中,我分配缓冲区并从dll函数中读取(char*) 主持人 char *buffer = (char *)malloc(1024); char *param = "Hello world"; // funcPtr is the pointer to the dll function below (for e.g) strcpy(buffer, (void *)(funcPtr

我在dll中调用导出的函数,不知道是否正确。我总是在主机和库函数之间传递(void*)。在主机应用程序中,我分配缓冲区并从dll函数中读取(char*)

主持人

char *buffer = (char *)malloc(1024);
char *param = "Hello world";
// funcPtr is the pointer to the dll function below (for e.g)
strcpy(buffer, (void *)(funcPtr)((void *)param));
// i can free the buffer here
free(buffer);
动态链接库

__declspec(dllexport) void* test(void *param) {
    char *data = (char *)param;
    int len = strlen(data);
    char *buffer = (char *)malloc(len + 1);
    strcpy(buffer, data);
    buffer[len] = '\0';
    return (void *)buffer;
    // but how do i free buffer here?
}

所以我分配了两次缓冲区,对吗?一旦进入主机和库,我可以在复制后释放主机中的缓冲区,但如何处理dll中分配的缓冲区?FreeLibrary不会立即释放dll并将其保留在内存中(此信息可能有用)。

它会创建字符串的副本,因此必须分配新内存

它还返回指向该内存的指针,因此就像您使用
缓冲区时所做的那样,您可以调用
free
,而不必在分配它的相同范围内调用它

请注意,此函数允许您创建字符串文字的可写副本,这样您就不能修改其值

char*literal\u str=“我是literal”;
char*dynmic_str=测试(文字_str);
// ... 做些事情。。。
自由(动态);
//无需释放文本\u str

它创建字符串的副本,因此必须分配新内存

它还返回指向该内存的指针,因此就像您使用
缓冲区时所做的那样,您可以调用
free
,而不必在分配它的相同范围内调用它

请注意,此函数允许您创建字符串文字的可写副本,这样您就不能修改其值

char*literal\u str=“我是literal”;
char*dynmic_str=测试(文字_str);
// ... 做些事情。。。
自由(动态);
//无需释放文本\u str

那么我做对了吗?看起来是这样。那么我做对了吗?看起来是这样。