指针与malloc混淆

时间:2014-04-14 13:51:14

标签: c pointers struct malloc

我的代码工作实现了大量的mallocs。它有

struct* node myList;
struct node { ... } // contains stuff
struct* node_constructor(...) {
    node* tempnode = (node*) malloc(sizeof(node));
    node* next = ...;
    ... // some other info
}

然后在我的主函数中调用

myList = node_constructor(myList,otherarguments...);

我认为可能有办法做某些事情,比如

temp = (node*) malloc(sizeof(node)*numberOfNodes);
for(i=0; i<numberOfNodes;i++) { temp[i].next = temp[i-1]; ... } // wrong?
temp[numberOfNodes-1]; // set myList equal to the last one

并摆脱构造函数和所有那些单独的mallocs,我似乎对如何处理我的malloced空间感到困惑。所以temp是(节点*),因此我非常确定我的temp[i].next = temp[i-1]事情是错误的......也许其他一些想法也是如此。如果有人有任何意见/建议,我会很感激。

3 个答案:

答案 0 :(得分:1)

好的,当然,你可以这样做,有点儿。只要温度足够大,你事先知道它的大小。并且temp更可能是void*或一些通用容器,只是挂在未指定的内存而不是节点上。 (因为它不是一个节点,所以你的所有节点都在这里。temp[x]temp被malloced时,它是一种黑客攻击。)

但现在您想要在列表中添加另一个节点。你是怎么做到的?

单个mallocs允许您将单个项目添加到列表中。如果您想要在列表中添加多个项目,那么您可以多次调用各个函数。

分配大量内存并将其分解为零碎部分的想法是一个有效的想法,它具有一些性能优势,但它的利基使用有限。

为一个以上的项目分配足够的内存更方便和常见。你没错,但请相信我,先学会正常的方法。

答案 1 :(得分:1)

如果要使用数组返回列表,则无需使用下一个指针 - 下一个对象是数组中的下一个索引。

与链表实现相比,数组列表实现有优点和缺点。

答案 2 :(得分:0)

理想情况下,您将拥有这样的节点:

typedef struct node
{
  struct node* next;
  struct node* prev; // optional for double-linked list

  uint8_t* data;
  size_t   data_size;

} node_t;

然后将其创建为

result_t  list_add (const void* data, size_t size)
{
  if(list_is_full()) // if applicable
  {
    return list_is_full_error;
  }

  node_t* new_node = node_constructor(data, size);

  if(new_node == NULL)
  {
    return memory_error;
  }

  list_add(new_node);

  return ok;
}

static node_t* node_constructor (const void* data, size_t size)
{
  node_t* new_node = malloc(*new_node);
  if(new_node == NULL)
  {
    return NULL;
  }

  new_node->data = malloc(size);
  if(new_node->data == NULL)
  {
    return NULL;
  }

  new_node->size = size;
  memcpy(new_node->data, data, size);

  return new_node;
}

static void list_insert (node_t* new_node)
{
  // add the node to the linked list here
  // set next/prev pointers of the new node and of adjacent nodes
  // increase node counter (linked list size) if applicable
}