如何在C中将指针值与NULL进行比较

时间:2013-01-27 03:05:52

标签: c

我正在编写一个删除链表中节点的函数,其输入是指向链表的指针。如果函数删除只有一个节点的链表,则该函数将使指针指向NULL。这是代码的一部分:

void remove(dlinkNode_t *start){
    //some previous code
    if(start->next==NULL){//meaning we're removing the head of the linked list
        dlinkNode_t current=start;  //get a temp pointer to point at this node
        start=NULL;    //make start point to null
        free(current); //free the head
        return;
    }
    // More code

在main中,我创建了一个包含一个节点的链接列表,并传递了此链接列表以删除函数以释放它。这是代码:

int main(){
    dlinkNode_t *node1=create();  //creates a node and make node1 point at it
    remove(node1);  //now node1 should point at NULL
    if(node1==NULL)
        printf("hi");
    return 0;
}

但我没看到喜打印。我不知道为什么if语句没有通过。有任何想法吗?

1 个答案:

答案 0 :(得分:3)

指针的新副本在remove的本地范围内。您对指针所做的任何更改只会在该范围内可见。您对指针指向的值所做的任何更改都将返回到调用范围。

您可以通过以下两种方式之一解决此问题:

  • 返回已编辑的指针

    node1 = remove(node1); 
    

    并在删除中进行更改。

    dlinkNode_t * remove(dlinkNode_t *start){
        //some previous code
        //Function code
        return start;
    
  • 或者您可以将指针传递给指针开始,然后操纵该指针。

    函数调用:

    remove(&node1);
    

    功能定义:

    void remove(dlinkNode_t **start){
        //some previous code
        if((*start)->next==NULL){ // meaning we're removing 
                                  // the head of the linked list
            dlinkNode_t current=**start; //get a temp pointer
                                         // to point at this node
            **start=NULL;  //make start point to null
            free(current); //free the head