如何使用函数将struct指针设置为NULL

时间:2017-05-15 13:03:47

标签: c pointers struct

我是C的新手。 我建立了一个这样的链表:

#include <stdio.h>
#include <memory.h>
#include <stdlib.h>

#define len(array) (sizeof(array) / sizeof(array[0]))

#define true 1
#define false 0

struct node{
    int data;
    struct node* next;
};

typedef struct node node;

node* initNode(void){
    node* headNode;
    headNode = (node *)malloc(sizeof(node));
    headNode -> next = NULL;
    return headNode;
}

node* create(int* array, int length){
    node* newNode;
    node* lastNode;
    node* headNode = initNode();
    newNode = (node *)malloc(sizeof(node));
    headNode -> data = array[0];
    int arrayLength = 1;
    int hasSetHead = false;
    while(arrayLength < length){
        if (! hasSetHead){
            lastNode = headNode;
            hasSetHead = true;
        }
        memset(newNode, 0, sizeof(node));
        newNode -> data = array[arrayLength];
        newNode -> next = NULL;
        lastNode -> next = newNode;
        lastNode = newNode;
        newNode = (node *)malloc(sizeof(node));
        if (newNode == NULL) exit(0);
        arrayLength++;
    }
    return headNode;
}

void clear(node* headNode){
    node* nextNode;
    if (headNode == NULL) return;
    while (headNode -> next != NULL){
        nextNode = headNode -> next;
        free(headNode);
        headNode = nextNode;
    }
    *headNode = NULL;
}

int main(void){
    int array[] = {1,2,3,4,5,6,7};
    int length = len(array);
    node* list = create(array, length);
    clear(list);
    system("pause");
    return true;
}

我想通过使用clear(struct pointer)清除我的结构。 但是在clear()的最后一行,我得到了这个错误:

error: incompatible types in assignment

我该怎么办? 谢谢!请忘记我可怜的英语。

谢谢!@Marievi 我改变了这样的代码:

headNode = NULL;

但是当我想要打印链表时。它似乎坏了,这是我的代码:

void clear(node* headNode){
    node* nextNode;
    if (headNode == NULL) return;
    while (headNode -> next != NULL){
        nextNode = headNode -> next;
        free(headNode);
        headNode = nextNode;
    }
    *headNode = NULL;
}

当我调用此函数时,似乎是泄漏。

4 个答案:

答案 0 :(得分:1)

更改行:

*headNode = NULL;

到:

headNode = NULL;

并且错误将消失。

此外,do not cast the result of malloc始终check if malloc was successful

答案 1 :(得分:0)

在您的函数中声明headNode

node* headNode

,相当于

struct node *headNode

因为类型为node的范围内的typedef。有问题的任务

*headNode = NULL;

正在尝试将值NULL(类型为void *的空指针常量)分配给*headNode指定的对象,即struct node。您无法将指针值分配给结构类型的对象,这是错误告诉您的内容。

可以NULL分配给headNode本身......

headNode = NULL;

...实际上另一个答案是观察到的,但是虽然编译器会接受它,但它不会产生你所效应的效果,因为headNode函数参数是函数的本地参数。它的值始终是其参数的(指针)值的副本,对本地副本的更改不会影响调用者的原始参数。

如果您希望更改来电者的副本,那么您有两个主要选择:

  1. 返回修改后的值(NULL)并让调用者将其分配给原始变量(如果愿意),或者

  2. 不是传递头指针本身,而是传递指向包含头指针(类型为node **)的变量的指针。

  3. 这两种选择都需要改变来电者;后者还需要进一步改变功能实施。

答案 2 :(得分:0)

clear函数过于复杂和错误。它没有释放最后一个元素。

这是正确的:

void clear(node* headNode) {
  node* nextNode;

  while (headNode != NULL) {
    nextNode = headNode->next;
    free(headNode);
    headNode = nextNode;
  }
}

如果您希望clear函数将其参数设置为NULL

你需要这个:

void clear(node** headNode) {
  node* nextNode;

  while (*headNode != NULL) {
    nextNode = (*headNode)->next;
    free(*headNode);
    *headNode = nextNode;
  }

  *headNode = NULL;
}

并像这样称呼它

clear(&list);
// now list is NULL

答案 3 :(得分:0)

这一行('*'删除后)没有任何作用,因为它只更改了本地headNode参数(100%将被编译器完全删除)

 headNode = NULL;

如果要为更高级别的指针指定NULL,则需要将节点** headnode传递给此函数或使其成为节点*:。 1。

void clear(node** headNode){
    node* nextNode;
    if (*headNode == NULL) return;
    while (*headNode -> next != NULL){
        nextNode = *headNode -> next;
        free(*headNode);
        *headNode = nextNode;
    }
    *headNode = NULL;
}

和电话

 clear(&list);

或更好

node *clear(node* headNode){
    node* nextNode;
    if (headNode == NULL) return;
    while (headNode -> next != NULL){
        nextNode = headNode -> next;
        free(headNode);
        headNode = nextNode;
    }
    return NULL;
}

和电话:

list = clear(list);