C中的常规树

时间:2014-02-07 21:37:14

标签: c pointers tree

我想在C中构建一个通用树。树的节点有一个字符串数组和一个子列表。

typedef struct treeNode {
    int numOfChildren;
    char** commands;
    struct treeNode** children;
} tNode;

tNode* head = (tNode*) malloc(sizeof(tNode));

tNode* node0 = (tNode*) malloc(sizeof(tNode));
tNode* node1 = (tNode*) malloc(sizeof(tNode));
node1->commands[0] = "hello";

在Linux中使用gcc进行编译时,它会给我一个分段错误。有人能告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

我要去

char** commands;

是错误的类型。这是一个指向包含char的指针的指针。所以当你这样做时

node1->commands[0] = "hello";

它获取hello的地址,然后将该地址的内容解释为指向您认为要分配的字符串的指针,并将该值分配给commands[0],这实际上只是{{ {1}}。如果课程是计算机乱码,并以您的分段错误结束。

您必须声明并使用

commands

或者您需要创建一些指向char* commands; ... node1->commands = "hello"; 的中间指针,例如{{1}在某处添加一块额外的内存块,并用指向commands的地址填充该指针

例如

malloc

当然,为命令[10]分配一些内容将是一个很大的错误,因为你要编写超过指定数组的末尾。

此外,当您释放hello时,您还必须免费#define MAXNUMCMDS 10 ... char** commands; … tNode* node1 = malloc(sizeof(tNode)); node1->commands = malloc(MAXNUMCMDS * sizeof(char*)); node1->commands[0] = "Hello"; node1->commands[1] = "World"; node1->commands[2] = "here"; node1->commands[3] = "is"; node1->commands[4] = "an"; node1->commands[5] = "example"; node1->commands[6] = "of"; node1->commands[7] = "an"; node1->commands[8] = "array of"; node1->commands[9] = "char*"; (从技术上讲,您需要先免费node1