C 在另一个函数中设置指针的值
我在C语言中的指针方面遇到了一些问题。基本上,我们的任务是编写一个N元树(族谱树)。任何单个节点都可以有任意数量的子节点(0、1、2、…)。我被困在增加单亲和独生子女的部分 理论上,父对象应该是根,子对象应该是根的子对象。我的add_child方法如下(到目前为止): 以下是结构: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
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…等”)
- 我的算法正确地打印了父名称,但在添加子名称时失败,并进入无限循环,如上面最后一个代码块中所述
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]