尝试用列表语言C编写时出错
函数adicional用于释放列表的循环是错误的。您正在释放当前元素尝试用列表语言C编写时出错,c,list,malloc,C,List,Malloc,函数adicional用于释放列表的循环是错误的。您正在释放当前元素L,然后在下一次迭代中使用L->nseg。释放指针后延迟它是未定义的行为 在释放当前元素之前,需要保存nseg指针 应该是: Nbig *makenode(){ Nbig *R = (Nbig*)malloc(sizeof(Nbig)); R->number=0; R->nant=NULL; R->nseg=NULL; return(R); } Nbig *delete_
L
,然后在下一次迭代中使用L->nseg
。释放指针后延迟它是未定义的行为
在释放当前元素之前,需要保存nseg
指针
应该是:
Nbig *makenode(){
Nbig *R = (Nbig*)malloc(sizeof(Nbig));
R->number=0;
R->nant=NULL;
R->nseg=NULL;
return(R);
}
Nbig *delete_list(Nbig *L) {
if(L==NULL){
return L;
}
Nbig *next;
while (L) {
next = L->nseg;
free(L);
L = next;
}
return NULL;
}
Nbig *insertfirst(Nbig *A,Nbig *nv){
if(A==NULL){
nv->nseg=NULL;
nv->nant=NULL;
return nv;
}
nv->nseg=A;
A->nant=nv;
return nv;
}
您的代码不可读:/在您执行
free(L)之后代码>在while
循环的下一次迭代中访问L->nseg
。这是未定义的行为。循环完成后,您将执行free(L)
。这将尝试释放在循环的最后一次迭代中释放的内容。发布的代码将导致编译器输出多条警告消息。这些警告信息中有几条是至关重要的。编译时,请始终启用警告,然后修复这些警告。(对于gcc
,至少使用:-Wall-Wextra-Wconversion-pedantic-std=gnu11
)以便于阅读和理解:1)单独的代码块(用于
而则执行…而开关
默认值
)通过一个空行。2) 用2或3个空行分隔函数(保持一致)3)遵循公理:每行只有一条语句,每条语句(最多)一个变量声明。您可能在未发布的函数中有其他错误。一个常见的错误是,在创建新的Nbig
节点时,忘记将nseg
初始化为NULL
。但是如果函数为NULL,则会出现其他问题。听起来是时候学习使用调试器来逐步调试程序了。我不打算尝试找出所有代码。学习使用调试器并自己解决。逻辑错误不会导致警告,它们只会产生错误的结果。
Nbig *makenode(){
Nbig *R = (Nbig*)malloc(sizeof(Nbig));
R->number=0;
R->nant=NULL;
R->nseg=NULL;
return(R);
}
Nbig *delete_list(Nbig *L) {
if(L==NULL){
return L;
}
Nbig *next;
while (L) {
next = L->nseg;
free(L);
L = next;
}
return NULL;
}
Nbig *insertfirst(Nbig *A,Nbig *nv){
if(A==NULL){
nv->nseg=NULL;
nv->nant=NULL;
return nv;
}
nv->nseg=A;
A->nant=nv;
return nv;
}
Nbig *apaga(Nbig *L) {
Nbig *next;
while (L) {
next = L->nseg;
free(L);
L = next;
}
return NULL;
}