我正在编写一个 C 应用程序,其中涉及将文本文件(以称为VSM的格式,因此以下名称)解析为树结构。该格式的设计者称其为标记树。每个节点都有一些键值对(或属性)和子节点。
以下是有问题的结构和函数:
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;