我对此代码有疑问,我试图理解发生了什么,但我无法理解为什么它只是粉碎。这些函数的工作方式与我期望的node-> left。
相同但是当函数的最后一次调用以case节点结束时,> left;该功能刚刚粉碎,我认为由于重新分配的阵列,我不知道我是否试图访问禁止的内存。
我将解释一下我认为问题的来源:我们在打印数组之前最后一次调用helper(node-> left,table,len):考虑len = N和node - > left!= NULL ==>重新分配表len = N + 1,将节点 - >数据分配给表[len],一切都很好,node-> left == NULL ==>打印表格,我们完成了帮助程序(node-> left,table,N)的情况;现在我们在帮手(node-> right,table,N)的情况下;在这种情况下,程序只是粉碎;它应该重新分配表格;并将node->数据分配给表[N];等等...
顺便说一下:这个函数试图在二叉树中打印所有的根叶路径。
struct node {
int data;
struct node* left;
struct node* right;
};
void helper(struct node* node,int *table,int len)
{
if(node == NULL){
return;
}
else{
table = realloc(table,(len+1)*sizeof(int));
table[len]=node->data;
len = len +1;
if(node->left == NULL && node->right == NULL)
{
int cmt=0;
for(cmt = 0; cmt < len ; cmt++ ){
printf("%d ->",table[cmt]);
}
}
else{
helper(node->left,table,len);
helper(node->right,table,len);
}
}
}
void print_rtl(struct node* node) {
if(NULL == node) return;
else{
int *t=malloc(sizeof(int));
t[0]=node->data;
int lenght = 1;
helper(node->left,t,1);
helper(node->right,t,1);
}
}
答案 0 :(得分:3)
关于realloc的问题是:它可以自由地改变分配的内存块的大小,还可以改变它的位置。通常,realloc可以破坏任何指向已重新分配的内存块中的对象的指针。当您稍后尝试使用这些指针时,您将获得未定义的行为。
您应该在程序开头分配足够的内存而不需要调用realloc,或者您应该重新设计程序,这样您就不需要首先分配该内存块了或者你应该使你的table
指针成为一个全局变量,这样当你改变它的值时,它会针对使用该表的每个函数进行更新。
现在您的代码问题在于,当您致电helper
时,它可能会调用realloc并更改您的表的位置,但它不会以任何方式将此更改传达给调用方,所以来电者不知道桌子的位置。
您的代码可能存在其他问题。如果您仍然遇到问题,我强烈建议您制作MCVE并在下一个问题中发帖。这样做可以让其他人更轻松地重现您的问题并找到真正有效的解决方案。
答案 1 :(得分:1)
很难说完全发生了什么事,因为它非常混乱,但通常...... helper()
做的第一件事(在验证{{1}之后})重新分配node!=NULL
。这意味着当你到达递归点时,table
将重新分配,然后在helper(node->left..
之后也会尝试这样做,但是在无效指针上。从那以后,这是一个疯狂的例外......