【问题标题】:How to replace Malloc in linked list [duplicate]如何替换链表中的Malloc [重复]
【发布时间】:2014-07-14 02:23:55
【问题描述】:

我目前正在处理注入错误,并且在其中一个应用程序中我想替换动态部分(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;
}

【问题讨论】:

  • 如何使用 satic 符号创建链表?这对我来说没有多大意义。最后你将只有一个符号。你的意思是“所以它不依赖于内核指令。”?
  • 你可以有一个预设的结构池和一些标志来显示当前正在使用的结构。将“malloc”替换为找到一个未使用的;并替换 'free' wuth 重置正在使用的标志。
  • @TheMask 我正在研究故障注入器。这会在指令寄存器内容中注入错误。如果生成任何异常,我有应用程序级处理程序,但是当错误注入 malloc 程序集部分时,内核正在处理信号而不是应用程序异常处理程序。
  • @MattMcNabb:你能详细说明一下吗,非常感谢
  • @Anonymous 另一个问题是关于如何使用诸如sbrk 之类的标准操作系统级动态分配原语来实现malloc。这是关于实现链表而不动态分配内存(就系统而言)。虽然它可能仍然是某些 SO 问题的副本,但它不是您链接到的问题的副本。

标签: c


【解决方案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;
        }
}

注意:这只是一个说明内存池概念的基本示例。它可以优化很多。关于分配器和内存池有很多理论(如果为计算机科学学位做研究生工作,你可以写一篇论文)。

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

【讨论】:

  • 你是对的,但至少指出缺陷可能仍然是一个好主意,这样未来的读者就不会将其复制到她的代码中,认为这是一个可行的解决方案。 (我删除了原来的评论,因为我使用两个堆栈的想法实际上行不通。)
  • 好的,更新说明这只是一个演示
猜你喜欢
  • 2012-10-01
  • 2010-10-25
  • 2016-05-22
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多