我想在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进行编译时,它会给我一个分段错误。有人能告诉我出了什么问题吗?
答案 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
)