马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
void BSTreeDATAPush(BSTree* T)
{
int chose;//用来限制循环体
do
{
if(DATAsub == num)
{
num = num+4;
BSTData* tmp = (BSTData*)realloc(T->DATA,sizeof(BSTData)*num);
if(!tmp)
{
printf("%s\n",strerror(errno));
exit(-1);
}
T->DATA = tmp;
free(tmp);
tmp = NULL;
}
printf("请插入数据:>");
scanf("%d",&(T->DATA[DATAsub]));
rewind(stdin);
DATAsub++;
printf("是否继续插入结点数据? 1.继续 0.退出 :>");
scanf("%d",&chose);
rewind(stdin);
//以上是仅存放需排序的无序数组信息。
} while (chose);
printf("结点数据录入结束。\n");
return ;
}
两个全局变量,num是专门用来开辟数组空间的变量;Datasub是数组的下标.
函数是我输入需要排序的数组用的,输入完数据它的值应该是和数组内存放的数据量是相同的。初始化接口里,已经开辟了4个int大小,在我输入第五个数据的时候,realloc没有提示出错。当第二次,也就是下标为8的时候,vscode提示分段错误。
也就是sub = 8; num = 12时,提示分段错误,还不是error报的……
我瞅了半天,也没见哪里有非法访问。 有没大佬解读一下?
您的代码存在一个错误,这可能是导致问题的原因。在执行 `realloc` 后,您立即调用了 `free(tmp);`。这样做会释放刚刚重新分配的内存,而您实际上还需要使用它。将 `free(tmp);` 这一行删除,问题应该会得到解决。此外,由于不再需要释放 `tmp`,您也可以将 `tmp = NULL;` 这一行删除。
修改后的代码如下:
void BSTreeDATAPush(BSTree* T)
{
int chose;//用来限制循环体
do
{
if(DATAsub == num)
{
num = num+4;
BSTData* tmp = (BSTData*)realloc(T->DATA,sizeof(BSTData)*num);
if(!tmp)
{
printf("%s\n",strerror(errno));
exit(-1);
}
T->DATA = tmp;
// 删除以下两行
// free(tmp);
// tmp = NULL;
}
printf("请插入数据:>");
scanf("%d",&(T->DATA[DATAsub]));
rewind(stdin);
DATAsub++;
printf("是否继续插入结点数据? 1.继续 0.退出 :>");
scanf("%d",&chose);
rewind(stdin);
//以上是仅存放需排序的无序数组信息。
} while (chose);
printf("结点数据录入结束。\n");
return ;
}
这样修改后,您的代码应该可以正常工作。
|