C 在另一个函数中设置指针的值

C 在另一个函数中设置指针的值,c,pointers,pointer-to-pointer,C,Pointers,Pointer To Pointer,我在C语言中的指针方面遇到了一些问题。基本上,我们的任务是编写一个N元树(族谱树)。任何单个节点都可以有任意数量的子节点(0、1、2、…)。我被困在增加单亲和独生子女的部分 理论上,父对象应该是根,子对象应该是根的子对象。我的add_child方法如下(到目前为止): 以下是结构: typedef struct FieldNode { char* name; NodeList** children; size_t child_count; } Node; typedef

我在C语言中的指针方面遇到了一些问题。基本上,我们的任务是编写一个N元树(族谱树)。任何单个节点都可以有任意数量的子节点(0、1、2、…)。我被困在增加单亲和独生子女的部分

理论上,父对象应该是根,子对象应该是根的子对象。我的add_child方法如下(到目前为止):

以下是结构:

typedef struct FieldNode {
    char* name;
    NodeList** children;
    size_t child_count;
} Node;

typedef struct FieldNode_L {
    Node* data;
    NodeList* next;
} NodeList;
现在我们已经解决了这个问题,我将转到print_tree函数,我们应该先打印树的宽度(逐级)。我已经为此编写了算法,但它无法将节点的子节点推到队列中。为此:

NodeList* current = *listPtr;
while (current->data != NULL) {
    Node* to_add = current->data;
    // set up queuenode and push it to the queue
    current = current->next;
}
因此,理论上,它应该运行一次,推送到队列,然后将current设置为next(下一个为null),返回检查while循环条件,然后失败并继续执行print_树方法的其余部分。但这并没有发生

在用gdb调试了5个小时之后,我可以告诉您:

  • 在返回add_child方法之前,所有内存位置都有效并指向正确的位置。在gdb中,设置断点后,我可以通过取消引用根指针(父名称、子计数和子名称)显示所有信息
  • 在print_-tree方法中,所有信息都保留在add_-child方法中设置的根目录中,子目录除外
  • 在add_child方法中设置的地址(我确认该地址保存了我输入的名称)已更改为用unicode字符填充的字符串(“\237\432\320…等”)
  • 我的算法正确地打印了父名称,但在添加子名称时失败,并进入无限循环,如上面最后一个代码块中所述
总而言之,我不知道内容为什么会改变。我怀疑我在add_child中分配了错误的值/地址(因为信息保留在add_child函数中,但在另一个方法中丢失了),但我感到困惑,因为根在函数中保存了一些信息,而不是所有信息

我是C语言的新手,仍在努力学习所有这些指针的东西,例如双指针。。。对此问题的任何帮助都将不胜感激

VALGRIND EDIT:根据要求,尽管我看不出它有什么帮助。我的代码运行在一个无限循环中,因此我的程序没有机会清理混乱。在最后一个代码块中,我展示了无限循环的where-how/where,我注释掉了为QueueNode分配空间的代码。在永远运行之后,它会占用大量的分配空间,但只有2个空闲空间。这就是为什么输出显示它有那么多

GCC EDIT:根据请求,我使用标志运行了GCC -沃尔-韦斯特拉-迂腐 并收到以下输出:

10:26: warning: unused parameter 'argv' [-Wunused-parameter]
154:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
89:1: warning: control reaches end of non-void function [-Wreturn-type]
我修复了最后两个问题(有符号和无符号之间的比较以及到达非void函数末尾的控件)。我以后需要的未使用的参数,所以我还不能更改它。无论如何,它不会有任何影响


在解决了这些问题之后,什么都没有改变——同样的错误仍然发生

如果您能展示该结构,我将不胜感激。对于神秘的内存错误,我还建议您使用valgrind。@我在结构定义中添加了TatsuyukiIshi,我将处理valgrind输出。您似乎在未初始化的节点上执行操作。请检查valgrind提到的第72行。@TatsuyukiIshi它已初始化。第72行在add_子函数中。在执行所有这些操作之后但在返回之前,我在函数内部设置了一个断点。显示所有变量/地址的所有值证实了我确实正确设置了它们,但当我退出函数时,它们丢失了。我在我的作品中解释了这一点。其他所有东西都卡住了(父项名称和子项大小),但实际的子项没有。如果您能显示结构,我将不胜感激。对于神秘的内存错误,我还建议使用valgrind。@TatsuyukiIshi在结构定义中添加,我将处理valgrind输出。似乎您正在未初始化的节点上执行操作。请检查valgrind提到的第72行。@TatsuyukiIshi它已初始化。第72行在add_子函数中。在执行所有这些操作之后但在返回之前,我在函数内部设置了一个断点。显示所有变量/地址的所有值证实了我确实正确设置了它们,但当我退出函数时,它们丢失了。我在我的作品中解释了这一点。其他的东西都卡住了(父母的名字和孩子的大小),但实际的孩子没有。
10:26: warning: unused parameter 'argv' [-Wunused-parameter]
154:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
89:1: warning: control reaches end of non-void function [-Wreturn-type]