我的程序只是粉碎,在递归函数中使用 realloc()
my program just crushes, using realloc() in recursive function
我对这段代码有疑问,我试图理解发生了什么,但我不明白为什么它会崩溃。这些函数的工作方式与我对 node->left 的预期一样。
但是当函数的最后一次调用结束时case node->left;该函数只是粉碎,我想是因为重新分配的数组,我不知道我是否正在尝试访问禁止的内存。
我会稍微解释一下我认为问题出在哪里 from:we 在 helper(node->left,table,len) 打印数组之前的最后一次调用中:考虑len = N 和 node->left!=NULL ==> 重新分配 table len = N+1,将 node->data 分配给 table[len] 一切正常,node->left = = NULL ==> 打印 table 并且我们完成了 helper(node->left,table,N) 的情况;现在我们处于 helper(node->right,table,N) 的情况下;在这种情况下,程序会崩溃;它应该重新分配 table;并将 node->data 分配给 table[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);
}
}
这是关于 realloc 的事情:它不仅可以自由更改分配的内存块的大小,还可以自由更改其位置。通常,realloc 可以破坏您拥有的任何指向重新分配的内存块中的对象的指针。当您稍后尝试使用这些指针时,您将得到未定义的行为。
您应该在程序开始时分配足够的内存,这样您就不需要调用 realloc,或者您应该重新设计您的程序,这样一开始就不需要分配该内存块,或者你应该让你的 table
指针成为一个全局变量,这样当你改变它的值时,它会为每个使用 table.
的函数更新
现在您的代码的问题是,当您调用 helper
时,它可能会调用 realloc 并更改您的 table 的位置,但它不会将该更改传达给调用者无论如何,所以调用者不知道 table 的位置。
您的代码可能还有其他问题。如果您仍然遇到问题,我强烈建议您在下一个问题中生成 MCVE 和 post。这样做可以让其他人更容易重现您的问题并找到实际可行的解决方案。
很难确切地说发生了什么,因为它相当混乱,但通常... helper()
做的第一件事(在验证 node!=NULL
) 重新分配 table
。这意味着当您到达递归点时,helper(node->left..
将重新分配,然后紧接着 helper(node->right..
也会尝试这样做,但在无效指针上。从那时起,这是一个通往例外的疯狂旅程......
我对这段代码有疑问,我试图理解发生了什么,但我不明白为什么它会崩溃。这些函数的工作方式与我对 node->left 的预期一样。
但是当函数的最后一次调用结束时case node->left;该函数只是粉碎,我想是因为重新分配的数组,我不知道我是否正在尝试访问禁止的内存。
我会稍微解释一下我认为问题出在哪里 from:we 在 helper(node->left,table,len) 打印数组之前的最后一次调用中:考虑len = N 和 node->left!=NULL ==> 重新分配 table len = N+1,将 node->data 分配给 table[len] 一切正常,node->left = = NULL ==> 打印 table 并且我们完成了 helper(node->left,table,N) 的情况;现在我们处于 helper(node->right,table,N) 的情况下;在这种情况下,程序会崩溃;它应该重新分配 table;并将 node->data 分配给 table[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);
}
}
这是关于 realloc 的事情:它不仅可以自由更改分配的内存块的大小,还可以自由更改其位置。通常,realloc 可以破坏您拥有的任何指向重新分配的内存块中的对象的指针。当您稍后尝试使用这些指针时,您将得到未定义的行为。
您应该在程序开始时分配足够的内存,这样您就不需要调用 realloc,或者您应该重新设计您的程序,这样一开始就不需要分配该内存块,或者你应该让你的 table
指针成为一个全局变量,这样当你改变它的值时,它会为每个使用 table.
现在您的代码的问题是,当您调用 helper
时,它可能会调用 realloc 并更改您的 table 的位置,但它不会将该更改传达给调用者无论如何,所以调用者不知道 table 的位置。
您的代码可能还有其他问题。如果您仍然遇到问题,我强烈建议您在下一个问题中生成 MCVE 和 post。这样做可以让其他人更容易重现您的问题并找到实际可行的解决方案。
很难确切地说发生了什么,因为它相当混乱,但通常... helper()
做的第一件事(在验证 node!=NULL
) 重新分配 table
。这意味着当您到达递归点时,helper(node->left..
将重新分配,然后紧接着 helper(node->right..
也会尝试这样做,但在无效指针上。从那时起,这是一个通往例外的疯狂旅程......