C语言结构体内存管理错误

2024-12-17 02:57:13
推荐回答(5个)
回答1:

你出现的问题是数组越界吧?
你申请的数组范围是0-》n-1的
malloc(sizeof(Cal_Tree)*(n*2-1));
for(i=2*n-1;i>=n;i--) 这里应该是越界了。
应该是
for(i=2*n-2;i>=n;i--)
-------------------------------
这个100%是越界错误,你以为C不能像java一岁羡样报出越界错误吗?
大错特错。
你写了没尘雀枣有分配给你的内存,应该当时就会报错,
可能是因为内存库函数的缺陷或者编译器的问题,
导致在派拆free中才抛出access violation之类的错误。

回答2:

for(i=2*n-1改成i=2*n-2,后面那个i>=n改成i
>n(自己考虑要不要改),c的雹败缓下标从0开始到N-1共N个数据。虽然是自己分配的内存,但是下标依然从0开始计数2*n-1个数据,最后一个枯侍下标是2*n-1-1=2*n-2,这源模是必须死记的。

回答3:

Cal_Tree *tree=(Cal_Tree*)malloc(sizeof(Cal_Tree)*(n*2)); 你的大小是2*n 而非2*n-1因为你是从0开始计数!! 例如 你n=10,那么
for(i=0;i{
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-1;
tree[i].op=-1;
}
for(i=2*n-1;i>=n;i--)
一前橡厅共有2*n个,所以malloc应该为慧隐2*n 调试通过。
free之所以报错,是因为c的free中有调试代码,检测是否越界如睁,其实 错误确实是在malloc中,代码我调试了的

回答4:

为了你的分,等10分钟

#include
#include
typedef struct
{
char parent;
char lchild;
char rchild;
char op;
int val;
}Cal_Tree;
void initTree(Cal_Tree *tree,int n)
{
int i;
for(i=0;i<尘弊升n;i++)
{
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-1;
tree[i].op=-1;
printf("5\n");
}
for(i=2*n-1;i>=n;i--)
{
tree[i].lchild=-1;
tree[i].rchild=-1;
tree[i].parent=-2;
tree[i].op=-1;
printf("6\n");
}
}
void giveAnswer(int n)
{
Cal_Tree *tree=(Cal_Tree*)malloc(sizeof(Cal_Tree)*(n*2));
printf("2\n");
initTree(tree,n);
printf("3\n");
free (tree);
printf("卜凯9\n");
}
main()
{
printf("派老1\n");
giveAnswer(10);
}

代码如下,这样尝试出来 的

回答5:

数组越界下标越界