在函数“create_memory_pool”中,我可以分配内存池,但我不知道如何从主程序中释放它。
我想我错过了如何将正确的指针从函数传递给free,以便释放先前分配的内存。
注意我无法更改传递给函数创建内存池的参数(不允许)。但可以改变功能内的内容。
#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;
}
答案 0 :(得分:4)
你的函数create_memory_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;
}
}
要
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);
你的整个案例1根本没有意义。
您应该查看指针的工作原理。
答案 1 :(得分:1)
指针不像你想的那样工作。您传递给create_memory_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
,所以你可以将它们全部删除。
实际上,一个函数可以返回多个值的-sort,但除了一个之外的所有值都必须使用pass-by-pointer参数:
boolean create_memory_pool(char **ptr, int size)
{
*ptr = malloc(size);
if (*ptr != NULL)
{
printf("malloc successful\n");
return true;
}
...
}
你的一些困惑似乎是因为C字符串文字是指针,而指针用于管理动态内存。但这并不意味着字符串文字用于指代动态内存!
答案 2 :(得分:1)
您声称必须遵守以下原型
boolean create_memory_pool(char *name, int size);
鉴于这个原型,很明显create_memory_pool
不应该分配自己的内存,但调用者有义务提供一块内存。
create_memory_pool
所做的是,它是否在块内创建了必要的簿记,这使得它可以用作内存池(我想,你可以从中分配较小的固定大小的块,在标题中使用不同的函数原型。)
/**
* Initialize a memory pool in {@code name}, which has size {@code size}.
*/
boolean create_memory_pool(char *name, int size)
{
// the initial bytes of {@code memory_pool} are the header
struct memory_pool *pool = (struct memory_pool*) name;
initialize stack pool->stack;
divide the remainder of the memory block after the header into blocks of size BLOCK_SIZE and add to the stack pool->stack;
}
/**
* Allocate a block of size {@code BLOCK_SIZE} in the memory pool {@code memory_pool} or return null on failure.
*/
void *alloc_block(char *poolopaque)
{
struct memory_pool *pool = (struct memory_pool*) poolopaque;
pop and return a block from pool->stack or return null;
}
/**
* Return a block of memory into the memory pool.
*/
void free_block(char *poolopaque, void *block)
{
struct memory_pool *pool = (struct memory_pool*) poolopaque;
add block to pool->stack
}