C中的全局指针未正确更新

时间:2015-10-30 06:10:29

标签: c

我正在做一个学校作业,我被困在我的全局变量链表上。根据需求,我有一个调用loadFile()函数的main函数。此函数检查输入并对其进行标记,然后将单词添加到链接列表。 loadFile()函数调用insert()函数,该函数创建节点并将其添加到列表中。这个问题是,如果我从loadFile()函数打印,列表工作正常,但如果我尝试从main函数打印,则无法正常工作。我将节点的头部作为全局变量,但这似乎不起作用。

Node  **headNode = NULL;
Node  **curr = NULL;

Boolean insert( char *new_string ){
Node *temp = (Node *)malloc(sizeof(Node));
temp->item = new_string;
if(headNode == NULL){
  temp->next = NULL;
  headNode = &temp;  
}
else{
  temp->next = (*headNode);
  headNode = &temp;
}
return true;
}

void loadFile()
{
 #define LINE_SIZE 256
  char input[LINE_SIZE];
  char *token = NULL;

  while ( fgets( input, LINE_SIZE, stdin ) )
  {
     // parse the data into separate elements
     token = strtok( input, " \t\n" );
     while ( token )
     {
       insert( token ); 

       token = strtok( NULL, " \t\n" );
      }
   }
}

2 个答案:

答案 0 :(得分:4)

问题最有可能在这一行:

temp->item = new_string;

new_stringloadFile的本地指针。从loadFile返回时,指针无效。

将其替换为

temp->item = strdup(new_string);

strdup不是标准库函数,但您可以非常轻松地实现它。在网上查找。

答案 1 :(得分:2)

您的全局变量应该是节点指针,而不是节点指针的指针。这里:

headNode = &temp;

指定局部变量的地址。从函数返回后,该变量立即超出范围,并使头指针无效。如果你的全球头只是一个指针,那你就

headNode = temp;

并正确地将新分配的内存分配给您的头部。

使用指针指向节点指针的想法可能来自与节点插入代码的混淆,该代码将头部作为参数传递。在这种情况下,签名将如下所示:

void insert(Node **head, const char *item);

然后,您将传递一个(可能是本地的)头指针的地址:

Node *head = NULL;

insert(&head, "banana");

在这种情况下,调用函数的本地头通过指向节点指针的指针进行修改 - 在insert函数中,head是节点指针的地址head < em>在调用函数中。请注意,调用代码中链接列表的头部仍然只是一个节点指针。

在你的情况下,你只有一个带有全局头的列表,你的头也应该只是一个节点指针。没有必要通过指向节点ponter的指针来改变头部;只有一个头,你可以直接和毫不含糊地使用它。