使用动态分配的内存初始化结构

时间:2014-04-22 01:08:10

标签: c pointers struct c89

我很难搞清楚如何动态分配内存,然后使用该内存初始化结构。我正在尝试创建一个二叉树,然后将子项设置为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;
}

3 个答案:

答案 0 :(得分:1)

您的以下逻辑不正确:

struct node *rootnode=malloc(sizeof(struct node));
scanf("%s ",rootnode.word);
rootnode.count=countchars(rootnode.word);/*haven't written this func yet*/

在上面的代码中,您已为 struct node 分配了内存。现在 word char 类型的指针。到目前为止,您已经分配了可以将地址存储到此变量中的内存。

现在您需要分配内存以复制到此特定变量中。您需要在此处查找或定义字符串的最大长度。例如(100)

rootnode.word = malloc(100*sizeof(char));
// Now you can use this memory further in your program.

顺便说一句,你需要将逻辑写入 free 内存。

答案 1 :(得分:1)

对于初学者,您需要在需要时分配用于“word”的缓冲区。接下来,通常的做法是将子指针设置为NULL以指示不存在。

所以

node.count=strlen(string); /* hope this is what you want, if not use strlen(string on next line) */
node.word = malloc(node.count+1);
strcpy(node.word, string);
node.leftChild = node.rightChild = NULL;

答案 2 :(得分:0)

struct node *是指针类型。要访问其值,您需要取消引用它们。以下显示了您的目标:

typedef struct node_t{
    char* word;
    int count;
    struct node_t* leftchild;
    struct node_t* rightchild;
} node;

int main(void){
    node *rootnode = (node*)malloc(sizeof(node));
    //scanf("%s ", rootnode.word);
    //rootnode.count = countchars(rootnode.word);/*haven't written this func yet*/
    rootnode->leftchild = (node*)malloc(sizeof(node));

    node* leftchild = rootnode->leftchild;
    leftchild->word = NULL;
    rootnode->rightchild = (node*)malloc(sizeof(node));

    node* rightchild = rootnode->rightchild;
    rightchild->word = NULL;
    return 0;
}

请注意,scanf行已注释 - 您需要为字缓冲区分配空间,然后才能读入它。我把它作为练习留给你:)