Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
在基于列表的程序中与0xC0000005崩溃_C - Fatal编程技术网

在基于列表的程序中与0xC0000005崩溃

在基于列表的程序中与0xC0000005崩溃,c,C,我对编程比较陌生,因为我刚开始上大学。我的任务是开发一个程序(通过使用函数和带有整数元素指针的链表),该程序执行以下操作: 函数从一开始就访问每个元素。如果当前元素加一等于i+1),则必须通过添加i和j-1之间的所有值来完成列表 如果当前元素后面跟着一个元素,则此 可以将succ\u ptr设置为NULL。因此,在下一次迭代中,您会遇到崩溃 for(i = 1; ptr->value + i <= succ_ptr->value; i++) for(i=1;ptr->val

我对编程比较陌生,因为我刚开始上大学。我的任务是开发一个程序(通过使用函数和带有整数元素指针的链表),该程序执行以下操作:

  • 函数从一开始就访问每个元素。如果当前元素加一等于i+1),则必须通过添加i和j-1之间的所有值来完成列表

  • 如果当前元素后面跟着一个元素,则此

    可以将
    succ\u ptr
    设置为
    NULL
    。因此,在下一次迭代中,您会遇到崩溃

    for(i = 1; ptr->value + i <= succ_ptr->value; i++)
    
    for(i=1;ptr->value+i值;i++)
    
    我认为您可以通过以下方式替换整个for循环:

    while (ptr->value + 1 < ptr->next_ptr->value)
        pre_insert(&ptr->next_ptr, ptr->next_ptr->value-1);
    
    while(ptr->value+1next\u ptr->value)
    预插入(&ptr->next ptr,ptr->next ptr->value-1);
    
    4建议:

    1) 关于你的评论:。。。我试着照你说的做,但程序还是不起作用。它在打印所有元素后停止。。。需要有一个显式的方法来退出循环。添加一个
    break语句。(参见文章底部的示例:

    2) 对于每个
    malloc
    /
    calloc
    ,调用一个
    free(…)语句

    3) 不要强制转换
    malloc()
    /
    calloc()

    i、 e.变更:
    *ptrptr=(结构列表*)malloc(sizeof(结构列表))
    收件人:
    *ptrptr=malloc(sizeof(结构列表))

    4)
    main
    函数的签名至少应为
    int main(void){…return 0;}
    (注意函数末尾的
    return
    语句)

    项目1的代码示例):

    while(ptr!=NULL)
    {
    如果(ptr->next_ptr!=NULL)
    {
    成功\u ptr=ptr->next\u ptr;
    如果(ptr->值+1值)
    {
    同时(ptr->value+1next_ptr->value)
    {
    预插入(&ptr->next ptr,ptr->next ptr->value-1);
    }
    ptr=ptr->next\u ptr;
    }
    否则如果(ptr->value>=成功ptr->value)
    {
    ptr->next_ptr=succu_ptr->next_ptr;
    V[k]=成功->值;
    免费(成功);
    k++;
    (*计数)+;
    ptr=ptr->next\u ptr;
    }
    }
    否则会中断;/…此处。。。
    }
    
    这与其说是解决问题的答案,不如说是代码检查。这个问题在代码评审时也被问到,因为代码并没有按预期工作,所以代码评审的主题是离题的

    对于数组,首选
    calloc
    而不是
    malloc
    C编程语言中有三个主要的分配函数,它们是
    void*malloc(size\u t size\u to\u allocate)
    ,以及。最初分配数组的最佳方法是
    calloc
    ,因为它清楚地显示您正在分配数组,并且因为它会将分配的内存归零

    检查内存分配错误 当您调用
    malloc()
    calloc()
    realloc()
    时,在使用mempory之前,应始终检查内存是否已实际分配。如果这些函数中的任何一个无法分配内存,那么它将返回
    NULL
    。通过空指针引用会导致未知行为,这通常是一个bug

    struct list *NewPtr(int value)
    {
        struct list *tmp_ptr = malloc(sizeof(*tmp_ptr));
        if (tmp_ptr == NULL)
        {
            fprintf(stderr, "malloc failed in allocation of new struct list");
            return NULL;
        }
    
        tmp_ptr->value = value;
        tmp_ptr->next_ptr = NULL;
    
        return tmp_ptr;
    }
    
    函数应该返回值
    pre_insert(struct list*ptrpr,int-value)
    函数应该返回新指针,而不是传入指向指针的指针以获取新指针值

    struct list* pre_insert(struct list * ptrptr, int value) {
        struct list * tmp_ptr;
    
        tmp_ptr = ptrptr;
        ptrptr = NewPtr(value);
        if (tmp_ptr)
        {
            ptrptr->next_ptr = tmp_ptr;
        }
    
        return ptrptr;
    }
    
    缺少链表函数 应该实现一组标准的链表函数,它们是

    • 创建节点(如上所示为
      *NewPtr(int值)
    • 插入节点
    • 附加节点
    • 删除节点
    • 查找节点
    使用这些常见的链表函数将更容易实现更大的问题解决方案

    复杂性 如果我打算在代码回顾中回顾这一点,我建议的第一件事是函数
    int complete\u list\u数组(struct list*ptr,int*V,int*count)
    太复杂了,这意味着它在单个函数中做的太多了。如果每个内部if的内容都是一个函数,那么编写/调试它会更容易

    这里有2个概念需要考虑,第一个是自顶向下的设计,第二个是单责原则。就是不断地将问题分解成越来越小的部分,直到每个部分都很容易实现。各国:

    每个模块、类或函数都应该对软件提供的功能的单个部分负责,并且该责任应该完全由该模块、类或函数封装


    您是否尝试过在调试器/valgrind中运行此程序?您的代码是否发现了问题?还是你只是在要求一份工作?我刚刚运行了你的代码,两次,输入了4项,然后输入了3项。这两种方法都没有任何明显的问题。我没有仔细检查你的代码(也许我以后会这样做),但是当你看到一个C0000…5错误时(我想你是在Windows上),这意味着访问被拒绝。当你处理指针和动态分配时,这通常意味着你正在访问一个无效的内存位置(例如,您分配了10个字节,而您正在11号写入)。因此,检查您的索引,因为您可能在某个时候弄乱了索引。使用调试器完成每个步骤可能会有所帮助。您不需要malloc返回值的强制转换。“如果当前元素后面跟一个元素hi。谢谢你的回复。我试着按照你说的做,但程序仍然不工作。它在打印所有元素后停止,甚至没有给出错误代码,就停留在那一点上。非常感谢你的回复和建议!我觉得我从中学到了比以前更多的东西。”
    while (ptr != NULL)
    {
        if (ptr->next_ptr != NULL)
        {
            succ_ptr = ptr->next_ptr;
            if (ptr->value + 1 <= succ_ptr->value)
            {
                 while (ptr->value + 1 < ptr->next_ptr->value)
                 {
                    pre_insert(&ptr->next_ptr, ptr->next_ptr->value-1);
                 }
                 ptr = ptr->next_ptr;
            }
            else if (ptr->value >= succ_ptr->value)
            {
                ptr->next_ptr = succ_ptr->next_ptr;
                V[k] = succ_ptr->value;
                free(succ_ptr);
                k++;
                (*count)++;
                ptr = ptr->next_ptr;
            }
        }
        else break;  //...Here...
    }
    
    struct list *NewPtr(int value)
    {
        struct list *tmp_ptr = malloc(sizeof(*tmp_ptr));
        if (tmp_ptr == NULL)
        {
            fprintf(stderr, "malloc failed in allocation of new struct list");
            return NULL;
        }
    
        tmp_ptr->value = value;
        tmp_ptr->next_ptr = NULL;
    
        return tmp_ptr;
    }
    
    struct list* pre_insert(struct list * ptrptr, int value) {
        struct list * tmp_ptr;
    
        tmp_ptr = ptrptr;
        ptrptr = NewPtr(value);
        if (tmp_ptr)
        {
            ptrptr->next_ptr = tmp_ptr;
        }
    
        return ptrptr;
    }