损坏的堆错误c
我正在尝试从父向量创建一棵树。但是,当我使用malloc创建节点时,会出现“损坏的堆错误”。它适用于前两个子级,但在第三个子级崩溃(或终止,但不连接根和子级) lab7.exe中0x77E8A879(ntdll.dll)处未处理的异常:0xC0000374: 堆已损坏(参数:0x77EC5910) 我已经实现了这一点,首先提取根并创建节点,然后提取根的子节点并创建它们 搜索根->搜索根并返回其值。 搜索子项的函数(搜索键) void create->创建子项的函数。我发送一个向量,它只包含特定父对象的子对象,而不包含其他子对象损坏的堆错误c,c,heap-corruption,C,Heap Corruption,我正在尝试从父向量创建一棵树。但是,当我使用malloc创建节点时,会出现“损坏的堆错误”。它适用于前两个子级,但在第三个子级崩溃(或终止,但不连接根和子级) lab7.exe中0x77E8A879(ntdll.dll)处未处理的异常:0xC0000374: 堆已损坏(参数:0x77EC5910) 我已经实现了这一点,首先提取根并创建节点,然后提取根的子节点并创建它们 搜索根->搜索根并返回其值。 搜索子项的函数(搜索键) void create->创建子项的函数。我发送一个向量,它只包含特定父
*typedef struct node
{
int value;
node *left;
node *right;
node *middle;
}TreeNodeParent;
int search_root(int in[9])
{
for (int i = 0; i < 9; i++)
{
if (in[i] == -1)
{
int var = i+1;
in[i] = -2;
return var;
}// pe else nu facem nimic
}
return -2;
}
int search_key(int in[9], int radacina)
{
for (int i = 0; i < 9; i++)
{
if (in[i] == radacina)
{
int var = i + 1;
in[i] = -2;
return var;
}
}
return -3;
}
TreeNodeParent *createOneNode(int value)
{
//the error appears here
TreeNodeParent* create = (TreeNodeParent*)malloc(sizeof(TreeNodeParent));
create->value = value;
create->left = create->middle = create->right = NULL;
return create;
}
void create(int vector[], TreeNodeParent* radacina)
{
for (int i = 0; i < 9; i++)
{
if (vector[i] == -3)//am stabilit ca -3 ii oprirea
{
break;
}
else
{
TreeNodeParent* create = createOneNode(vector[i]);
if (radacina->left == NULL)
{
radacina->left = create;
}
else if (radacina->middle == NULL)
{
radacina->middle = create;
}
else
{
radacina->right = create;
}
}
}
}
int main()
{
int input[9] = { 2,7,5,2,7,7,-1,5,2 };
int root = search_root(input);
if (root == -2)
{
printf("Nu gasim radacina, arbore incorect!");
}
else { printf("root %d", root); }
//crearea nodului parinte
TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
rootParent->value = root;
rootParent->left = NULL;
rootParent->right = NULL;
rootParent->middle = NULL;
int vect2[9];
for (int i = 0; i < 9; i++)//worst case, tot arborele is copii ai lui root->o(n2)
{
vect2[i] = search_key(input, root);
printf("copii rootului %d", vect2[i]);
if ( vect2[i] == -3)
{
break;
}
}
create(vect2,rootParent);
_getch();
return 0;
}
我不明白为什么函数只在第三天(而不是之前)崩溃。而且它并不总是出现。有时它工作正常,但有时会因该错误而停止。
还有,是否有更好的方法创建具有父表示的树 我认为问题出在您的
main()
方法中,您使用sizeof(TreeNodeParent*)
而不是sizeof(TreeNodeParent)
将其分配给rootParent
:
//crearea nodului parinte
//TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent)); `
这里有输入错误radacina->right==create;您可能希望它是radacina->right=create;是的,谢谢!但是createOneNode函数出现错误。那么问题不在发布的代码中。请同时提供堆栈或堆?它们是完全不同的东西。调用
free()
并导致程序崩溃时,您会注意到堆损坏。堆栈损坏将导致随机行为,并将由递归、堆栈溢出、失控代码或指针错误等引起。避免问题中的图像。以文本形式提供一些。使用所有警告和调试信息编译(因此gcc-Wall-Wextra-g
with..)。改进代码以不获取警告。使用调试器(如)和动态堆分析工具(如)。你应该修改你的问题来改进它。我来看看,谢谢!但是,我不确定in-sizeof应该是(TreeNodeParent*)还是(TreeNodeParent)。sizeof(TreeNodeParent*)
只是指向TreeNodeParent
结构的指针的大小(4或8个字节,取决于您的体系结构),而不是整个结构的大小。例如sizeof(int*)、sizeof(long*)
或sizeof(TreeNodeParent*)
都是相同的。如果您喜欢整个结构的大小,请使用sizeof(TreeNodeParent)
。感谢您澄清差异!
//crearea nodului parinte
//TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent*));
TreeNodeParent* rootParent = (TreeNodeParent*)malloc(sizeof(TreeNodeParent)); `