取消引用指向空指针的指针?

时间:2015-09-04 02:14:13

标签: c

我试图在c中构建一个健壮的LinkedList,我正在处理的一个问题是初始化。

struct node* list = malloc(sizeof(node))

是一种初始化LList的明显方法,但它会将head元素value初始化为0,这不是我想要的。新初始化的LList不应包含任何节点。相反,我想做这样的事情:

struct node* list = NULL;

创建一个LList,然后使用:

添加元素
add(&list, 1);
add(&list, 2);

这基本上是解除引用&list,测试是否是NULL,如果是,那么X否则做Y.但是,显然我是错误的,我想知道是不是因为我我解除引用指向空指针的指针?

添加()

  8 void add(struct node** headRef, int value) {
  9   struct node* node = *headRef;
 10   struct node* new_node = malloc(sizeof(*new_node));
 11 
 12   new_node->value = value;
 13   new_node->next = NULL;
 14 
 15   if (node == NULL) {
 16     node = malloc(sizeof(node));
 17     node = new_node;
 18   } else {
 19 
 20     while (node->next != NULL) {
 21       node = node->next;
 22     }
 23 
 24     node->next = new_node;
 25   }
 26 }

由于

2 个答案:

答案 0 :(得分:1)

此代码有3个问题:

node = malloc(sizeof(node));
node = new_node;

首先,你将malloc错误的字节数。使用模式node = malloc(sizeof *node);

其次,这会泄漏内存:您将node指向新分配的内存块。然后,您将node指向对象new_node指向的位置。这没有留下指向已分配块的指针。

第三,node是函数的局部变量,因此函数外部的代码不会看到此更改。

我认为你的意思是整个功能如下:

void add(struct node** headRef, int value)
{
// Make the new node
    struct node* new_node = malloc(sizeof *new_node);
    new_node->value = value;
    new_node->next = NULL;

// If the list is empty then make the new node be the first node
    if ( *headRef == NULL ) 
        *headRef = new_node;

// Otherwise put this node on the end of the list
    else for ( struct node *ptr = *headRef; ; ptr = ptr->next )
    {
         if ( ptr->next == NULL )
         {
              ptr->next = new_node;
              break;
         }
    }
}

答案 1 :(得分:0)

指针只是一种访问内存的机制。不同类型的指针具有不同的访问机制。整数指针读取4个字节,而字符指针只读取一个字节指针。

对于存储内容,您需要分配内存。分配内存后,可以使用不同的指针访问它。 当你写:

  new_node=(struct node*)malloc(sizeof(struct node))

这意味着您正在分配一些内存并使用new_node指针访问它。

当你写:

   node=new_node

这意味着节点将指向new_node当前引用的相同内存。您不需要为节点分配内存,因为您只是使用它来访问已分配的内存。

void add(struct node** headRef, int value) {
    struct node* node = *headRef;
    struct node* new_node = malloc(sizeof(struct node));//Always mention datatype rather than mentioning a particular value;

    new_node->value = value;
    new_node->next = NULL;

    if (node == NULL) {
      //node = malloc(sizeof(node)); //Not required as you are just accessing the pre-allocated memory;

      *headRef = new_node; //Change the actual pointer rather than the local one;
    } else {

      while (node->next != NULL) {
        node = node->next;
      }

      node->next = new_node;
    }
 }