我在将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;
}
答案 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
的用户可以选择使用自动分配或动态分配(而其他提议的答案则强制使用动态分配)。