将结构的指针成员分配为null

时间:2015-04-12 01:17:53

标签: c pointers

我在将struct中的指针指定为null时遇到了一些困难。由于指针是按值传递的,所以我找不到一种简单的方法来执行此操作。也许这是漫长的一天,我不能直接思考。无论如何,这是我的代码:

void
init_wordrec (wordrec *rec)
{
    if ((rec = (wordrec *) malloc(sizeof(wordrec))) == NULL) {
        perror("Malloc failed");
        exit(1);
    }
    rec->word = NULL;
    rec->hits = 0;
    rec->nxt_wd = NULL;
}

这是wordrec结构:

typedef struct wordrec
{
    char *word;
    int hits;
    struct wordrec *nxt_wd;
} wordrec;

我希望实际的单词指针指向null,不幸的是我的尝试只会导致gcc大声抱怨。

编辑:这是我传入word结构的方法。

void
add_word (char *word, wordrec *head)
{
    wordrec *iter = head;
    wordrec *tmp;
    if (iter->word == NULL) { //This should be NULL but is not
        if ((iter->word = (char *) malloc((strlen(word) + 1) * sizeof(char))) == NULL) {
            perror("Malloc failed");
            exit(1);
        }
        strncpy(iter->word, word, strlen(word) + 1);
        iter->hits++;
        init_wordrec (iter->nxt_wd);
    } else if (strcmp(iter->word, word) < 0) {
        init_wordrec (tmp);
        if ((tmp->word = (char *) malloc((strlen(word) + 1) * sizeof(char))) == NULL) {
            perror("Malloc failed");
            exit(1);
        }
        strncpy(tmp->word, word, strlen(word) + 1);
        tmp->hits++;
        tmp->nxt_wd = head; 
        head = tmp;
    } else if (strcmp(iter->word, word) > 0) {
        add_word (word, iter->nxt_wd);
    } else {
        iter->hits++;
    }
}

主:

int 
main()
{
    wordrec head;
    char word1[] = "Hello";
    init_wordrec (&head);
    add_word(word1, &head);
    return 0;
}

3 个答案:

答案 0 :(得分:5)

你的意思是这样的:

void init_wordrec(wordrec **rec)
{
    if ((*rec = (wordrec *) malloc(sizeof(wordrec))) == NULL) {
        perror("Malloc failed");
        exit(1);
    }
    (*rec)->word = NULL;
    (*rec)->hits = 0;
    (*rec)->nxt_wd = NULL;
}
....
wordrec *wr;
init_wordrec(&wr);

答案 1 :(得分:3)

另一种方式是分配 - 您将一个值(例如NULL)分配给变量,例如rec->word

您可以将双指针传递给函数:

void
init_wordrec (wordrec **rec)
{
    if ((*rec = (wordrec *) malloc(sizeof(wordrec))) == NULL) {
        perror("Malloc failed");
        exit(1);
    }
    (*rec)->word = NULL;
    (*rec)->hits = 0;
    (*rec)->nxt_wd = NULL;
}
/* ... */
wordrec *wr = 0;
init_wordrec(&wr);

但是因为你在函数中分配(所以你只是要抛弃传入的值)使它返回新记录通常会简化代码:

wordrec*
init_wordrec(void)
{
    wordrec *rec = malloc(sizeof(*rec));
    if (rec == NULL) {
        perror("Malloc failed");
        exit(1);
    }
    rec->word = NULL;
    rec->hits = 0;
    rec->nxt_wd = NULL;
    return rec;
}
/* ... */
wordrec *wr = init_wordrec();

你不应该投射malloc的结果;即使你没有包含它的原型,它也会使代码编译,但在运行时会很糟糕。

答案 2 :(得分:1)

更简单的选择是:

void init_wordrec (wordrec *rec)
{
    rec->word = NULL;
    rec->hits = 0;
    rec->nxt_wd = NULL;
}

允许main中的代码保持不变:

int main()
{
    wordrec head;
    char word1[] = "Hello";
    init_wordrec (&head);

这样做的另一个好处是wordrec的用户可以选择使用自动分配或动态分配(而其他提议的答案则强制使用动态分配)。