gpt4 book ai didi

c - 操作数组导致段错误?

转载 作者:太空宇宙 更新时间:2023-11-04 06:33:03 24 4
gpt4 key购买 nike

我正在编写一个 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;

最佳答案

以下是此代码可能出现段错误的原因:

  1. node 为 NULL,未初始化,指向已释放的内存,或者
  2. node->children 为 NULL,未初始化,指向已释放的内存,或者
  3. node->numchildren 大于分配的node->children

确保调用代码:

  1. 分配节点
  2. 分配节点->子节点
  3. 设置节点->numchildren
  4. 为节点传入正确的值

查看粘贴的调用代码...

调用代码不分配节点;它是一个未初始化的指针,这意味着它指向内存中的一个随机位置。

由于命名而误读了该代码。传递下来的 child 是一个未初始化的指针,但在演示代码中不会出现段错误,因为它从未被取消引用。

第一次输入 { 时,它应该可以正常工作。第二次它应该出现段错误,因为 this = nodethis 设置为未初始化的指针。

关于c - 操作数组导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565113/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com