テキストファイル( VSMと呼ばれる形式、したがって以下の名前)をツリー構造に解析するCアプリケーションを作成しています。この形式の設計者は、これをタグ付きツリーと呼んでいます。各ノードには、いくつかのキーと値のペア (または属性) と子ノードがあります。
以下は、問題の構造体と関数です。
vsm.h:
struct vsm_node {
int numchildren;
struct vsm_attribute *attrs [36];
struct vsm_node *children[8];
};
void vsm_addchild(struct vsm_node *node, struct vsm_node *child);
vsm.c:
#include "vsm.h"
void vsm_addchild(struct vsm_node *node, struct vsm_node *child)
{
node->children[node->numchildren] = child;
++(node->numchildren);
}
呼び出すvsm_addchild
とセグメンテーション違反が発生するのはなぜですか?
これがばかげた質問なら申し訳ありませんが、私は単純な C が本当に苦手です。特にポインタとメモリ管理に関係する場合はなおさらです。
編集して、呼び出しを行うコードを含めます。
#include <stdio.h>
#include "vsm.h"
void vsm_parse(struct vsm_node *tree, FILE *fp, char *name)
{
struct vsm_node *this = tree;
int ch;
while ((ch = fgetc(fp)) != 0) {
...
else if (ch == '{') {
struct vsm_node *node;
vsm_initnode(node);
vsm_addchild(this, node);
this = node;
...
...
編集:機能を追加しましたvsm_initnode
が、正しく行っているかどうかわかりません。
void vsm_initnode(struct vsm_node *node)
{
node = malloc( sizeof(struct vsm_node *));
node->attrs = malloc(36 * sizeof(struct vsm_attribute *));
node->children = malloc( 8 * sizeof(struct vsm_node *));
node->numchildren = 0;
int i;
for (i = 0; i < 36; ++i)
node->attrs[i] = NULL; /* unnecessary? */
for (i = 0; i < 8; ++i)
node->children[i] = NULL;
}
void vsm_addchild(struct vsm_node *node, struct vsm_node *child)
{
node->children[node->numchildren] = child;
++(node->numchildren);
}
gdb 出力:
Program received signal SIGSEGV, Segmentation fault.
vsm_addchild (node=0x28, child=0x7541612d <msvcrt!_atodbl_l+2294>) at vsm.c:62
62 node->children[node->numchildren] = child;