C 如何通过向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”中,我可以分配内存池,但我不确定如何将其从主程序中释放出来

我想我缺少了如何将正确的指针从函数传递到free,通过它我可以释放以前分配的内存


注意:我无法更改传递给函数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:赋值?唯一的解决方案是使用全局变量来保存动态内存。但是,如果要使用不同的名称多次调用此函数,则必须创建某种关联容器。超出范围