【发布时间】:2014-04-22 01:08:10
【问题描述】:
我很难弄清楚如何动态分配内存,然后用该内存初始化一个结构。我正在尝试制作一棵二叉树,然后将孩子设置为 NULL 作为他们的“单词”,这是我可以测试 NULL 并根据需要插入更多节点。这是我目前所拥有的。
#include <stdio.h>
#include <stdlib.h>
struct node{
char* word;
int count;
struct node* leftchild;
struct node* rightchild;
};
int main(void){
struct node *rootnode=malloc(sizeof(struct node));
scanf("%s ",rootnode.word);
rootnode.count=countchars(rootnode.word);/*haven't written this func yet*/
rootnode.leftchild=malloc(sizeof(struct node));
struct node* leftchild = rootnode.leftchild;
rootnode.leftchild.word=NULL;
rootnode.rightchild=malloc(sizeof(struct node));
struct node* rightchild = rootnode.rightchild;
rootnode.rightchild.word=NULL;
}
【问题讨论】:
-
刚开始,您需要在需要时分配用于“word”的缓冲区。
-
接下来,通常的做法只是将子指针设置为NULL,表示不存在。
-
countchars的正确拼写实际上是strlen(你还需要包含<string.h>标头)。 -
带有尾随空格的格式字符串
"%s "用于交互式输入是危险的。在您键入以下内容之前,它不会返回:(1) 可选的空白字符串,(2) 一个或多个非空白字符的字符串,(3) 一个或多个空白字符的字符串,后跟(4) 非空白字符。令人惊讶的是(4),但在遇到非空白字符之前,它不知道它是否完成了处理(3)。这种行为通常不是您想要的。如果输入严格来自文件是可以的,但大多数时候不是终端输入。 -
您需要在读取输入之前为
rootnode.word分配空间,或者将输入读入缓冲区,然后为缓冲区的副本分配空间。您还应该检查malloc()的结果,以确保您不会取消引用空指针。而且,正如 DrC 指出的那样,您应该简单地设置rootnode.leftchild = NULL;和rootnode.rightchild = NULL;,而不是使用空的word指针分配完整的结构。除此之外,它大大简化了将第二个和后续单词添加到列表中的过程。