如何在链表中替换Malloc

时间:2014-05-25 00:49:05

标签: c

我目前正致力于注入错误,并且在其中一个应用程序中我想要替换动态部分(Malloc)并使其成为静态,因此它不依赖于内核指令。 这是基本的链表程序。如何替换Malloc指令并仍然使喜欢的列表工作。

struct test_struct* create_list(int val)
{
    printf("\n creating list with headnode as [%d]\n",val);    

    struct test_struct *ptr = (struct test_struct*)malloc(sizeof(struct test_struct));

    if(NULL == ptr1)
    {   
        printf("\n Node creation failed \n");
        return NULL;
    }

    ptr1->val = val;
    ptr1->next = NULL;
    head = curr = ptr1;
    return ptr1;
}

1 个答案:

答案 0 :(得分:1)

您可以使用固定大小的池编写自己的malloc / free,例如:

typedef struct test_struct T;
#define POOL_SIZE 100
static bool pool_use[POOL_SIZE] = { 0 };
static T pool[POOL_SIZE];

T *t_malloc(void)
{
    for (int ii = 0; ii < POOL_SIZE; ++ii)
        if ( !pool_use[ii] )
        {
            pool_use[ii] = 1;
            return &pool[ii];
        }

    return NULL;
}

void t_free(T *t)
{
    for (int ii = 0; ii < POOL_SIZE; ++ii)
        if ( t == &pool[ii] )
        {
             pool_use[ii] = 0;
             break;
        }
}

注意:这只是一个说明内存池概念的基本示例。它可以进行很多优化。关于分配器和内存池有很多理论(如果你做一个综合科学专业的研究生课程,你可以写一篇论文)。

如果您的应用程序将取决于此分配器的速度和/或空间效率,那么您可以对可用的技术进行更多研究。