Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试用列表语言C编写时出错_C_List_Malloc - Fatal编程技术网

尝试用列表语言C编写时出错

尝试用列表语言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_

函数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_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;
}