C 如何通过向free()传递正确的指针来释放函数中分配的内存
在函数“create_memory_pool”中,我可以分配内存池,但我不确定如何将其从主程序中释放出来 我想我缺少了如何将正确的指针从函数传递到free,通过它我可以释放以前分配的内存C 如何通过向free()传递正确的指针来释放函数中分配的内存,c,memory-management,C,Memory Management,在函数“create_memory_pool”中,我可以分配内存池,但我不确定如何将其从主程序中释放出来 我想我缺少了如何将正确的指针从函数传递到free,通过它我可以释放以前分配的内存 注意:我无法更改传递给函数create memory pool的参数(不允许)。但可以改变函数内的内容 #include <stdio.h> #include <stdlib.h> typedef enum { false, true } boolean; boolean
注意:我无法更改传递给函数create memory pool的参数(不允许)。但可以改变函数内的内容
#include <stdio.h>
#include <stdlib.h>
typedef enum {
false,
true
} boolean;
boolean create_memory_pool(char *name, int size)
{
name = malloc(size);
if (name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
int main()
{
boolean rc;
char *name;
// case 2
rc = create_memory_pool(name, 1024);
free(name);
return 0;
}
#包括
#包括
类型定义枚举{
假,,
真的
}布尔型;
布尔创建内存池(字符*名称,整数大小)
{
名称=malloc(大小);
if(name!=NULL)
{
printf(“malloc successful\n”);
返回true;
}
其他的
{
printf(“malloc失败\n”);
返回false;
}
}
int main()
{
布尔rc;
字符*名称;
//案例2
rc=创建内存池(名称,1024);
免费(姓名);
返回0;
}
指针的工作方式与您想象的不同。传递给create\u memory\u pool
的名称无效。如果你想返回分配的内存。。。嗯,你得把它退了
char *create_memory_pool(int size)
{
char *ptr = malloc(size);
if (ptr != NULL)
{
printf("malloc successful\n");
return ptr;
}
else
{
printf("malloc failed\n");
return NULL;
}
}
但是,这个函数只不过是调用malloc
,所以您可以一起删除它
实际上,一个函数可以返回多个值,但除一个外,所有值都必须使用按指针传递的参数:
boolean create_memory_pool(char **ptr, int size)
{
*ptr = malloc(size);
if (*ptr != NULL)
{
printf("malloc successful\n");
return true;
}
...
}
您的一些困惑似乎源于这样一个事实,即在C中,字符串文字是指针,指针用于管理动态内存。但这并不意味着字符串文字被用来指代动态内存 指针不像你想的那样工作。传递给
create\u memory\u pool
的名称无效。如果你想返回分配的内存。。。嗯,你得把它退了
char *create_memory_pool(int size)
{
char *ptr = malloc(size);
if (ptr != NULL)
{
printf("malloc successful\n");
return ptr;
}
else
{
printf("malloc failed\n");
return NULL;
}
}
但是,这个函数只不过是调用malloc
,所以您可以一起删除它
实际上,一个函数可以返回多个值,但除一个外,所有值都必须使用按指针传递的参数:
boolean create_memory_pool(char **ptr, int size)
{
*ptr = malloc(size);
if (*ptr != NULL)
{
printf("malloc successful\n");
return true;
}
...
}
您的一些困惑似乎源于这样一个事实,即在C中,字符串文字是指针,指针用于管理动态内存。但这并不意味着字符串文字被用来指代动态内存 您的函数
create\u memory\u pool
未公开任何指针
您必须将其更改为:
boolean create_memory_pool(char *name, int size)
{
name = malloc(size);
if (name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
到
在您的main
中,将案例2中的调用更改为:
rc = create_memory_pool(&name, 1024);
你的整个案例一点意义都没有
你应该回顾一下指针是如何工作的。你的函数
创建内存\u池
没有暴露任何指针
您必须将其更改为:
boolean create_memory_pool(char *name, int size)
{
name = malloc(size);
if (name != NULL)
{
printf("malloc successful\n");
return true;
}
else
{
printf("malloc failed\n");
return false;
}
}
到
在您的main
中,将案例2中的调用更改为:
rc = create_memory_pool(&name, 1024);
你的整个案例一点意义都没有
您应该回顾指针的工作原理。您声称必须遵循以下原型
boolean create_memory_pool(char *name, int size);
考虑到这个原型,显然create\u memory\u pool
不应该分配自己的内存,但是调用者有义务提供一块内存
相反,create\u memory\u pool
所做的是,它在块内创建必要的簿记,从而允许将其用作内存池(我想,您可以从中分配较小的固定大小的块,在头中使用不同的原型函数)
您声称必须遵守以下原型
boolean create_memory_pool(char *name, int size);
考虑到这个原型,显然create\u memory\u pool
不应该分配自己的内存,但是调用者有义务提供一块内存
相反,create\u memory\u pool
所做的是,它在块内创建必要的簿记,从而允许将其用作内存池(我想,您可以从中分配较小的固定大小的块,在头中使用不同的原型函数)
Gobbo A.de Oliv you解决方案实际上是可行的,但如果不允许我更改布尔创建内存池(char*name,int size),那么参数必须相同。还有什么办法吗?@shunya没有办法了(或者我错过了一些非常明显的东西)。如果这是一项援助,您可能会误解该职能的建议。为什么您不能更改函数的参数
名称
?Gobbo A.de Oliv基本上我得到了一个带有函数原型的头文件,这是其中之一,我不能更改原型,必须根据头文件来实现。@shunya请检查您的实现要求。很可能是对他们的误解。如果你正在接受辅导,问问你的老师或朋友。或者编辑您的说明,我们可能会提供更多帮助;DGobbo A.de Oliv您的解决方案实际上是可行的,但是如果不允许我更改布尔创建内存池(char*name,int size),那么参数必须相同。还有什么办法吗?@shunya没有办法了(或者我错过了一些非常明显的东西)。如果这是一项援助,您可能会误解该职能的建议。为什么您不能更改函数的参数名称
?Gobbo A.de Oliv基本上我得到了一个带有函数原型的头文件,这是其中之一,我不能更改原型,必须根据头文件来实现。@shunya请检查您的实现要求。很可能是对他们的误解。如果你正在接受辅导,问问你的老师或朋友。或者编辑您的说明,我们可能会提供更多帮助;Di无法更改布尔创建内存池(char*name,int size)函数中的参数或类型还有其他方法吗?@shunya:赋值?唯一的解决方案是使用全局变量来保存动态内存。但是,如果要使用不同的名称多次调用此函数,则必须创建某种关联容器。超出范围