如何正确处理c中函数分配和交换的缓冲区
我在dll中调用导出的函数,不知道是否正确。我总是在主机和库函数之间传递(void*)。在主机应用程序中,我分配缓冲区并从dll函数中读取(char*) 主持人如何正确处理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
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
那么我做对了吗?看起来是这样。那么我做对了吗?看起来是这样。