在基于列表的程序中与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循环:for(i=1;ptr->value+i值;i++)
while (ptr->value + 1 < ptr->next_ptr->value) pre_insert(&ptr->next_ptr, ptr->next_ptr->value-1);
4建议: 1) 关于你的评论:。。。我试着照你说的做,但程序还是不起作用。它在打印所有元素后停止。。。需要有一个显式的方法来退出循环。添加一个while(ptr->value+1
next\u ptr->value) 预插入(&ptr->next ptr,ptr->next ptr->value-1); break语句。(参见文章底部的示例: 2) 对于每个
/malloc
,调用一个calloc
free(…)代码>语句 3) 不要强制转换
/malloc()
calloc()
i、 e.变更:*ptrptr=(结构列表*)malloc(sizeof(结构列表))代码>
收件人:*ptrptr=malloc(sizeof(结构列表))代码> 4)
函数的签名至少应为main
(注意函数末尾的int main(void){…return 0;}
语句) 项目1的代码示例):return
这与其说是解决问题的答案,不如说是代码检查。这个问题在代码评审时也被问到,因为代码并没有按预期工作,所以代码评审的主题是离题的 对于数组,首选while(ptr!=NULL) { 如果(ptr->next_ptr!=NULL) { 成功\u ptr=ptr->next\u ptr; 如果(ptr->值+1值) { 同时(ptr->value+1
next_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
C编程语言中有三个主要的分配函数,它们是malloc
,以及。最初分配数组的最佳方法是void*malloc(size\u t size\u to\u allocate)
,因为它清楚地显示您正在分配数组,并且因为它会将分配的内存归零 检查内存分配错误 当您调用calloc
、malloc()
或calloc()
时,在使用mempory之前,应始终检查内存是否已实际分配。如果这些函数中的任何一个无法分配内存,那么它将返回realloc()
。通过空指针引用会导致未知行为,这通常是一个bugNULL
函数应该返回值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值)
- 插入节点
- 附加节点
- 删除节点
- 查找节点
太复杂了,这意味着它在单个函数中做的太多了。如果每个内部if的内容都是一个函数,那么编写/调试它会更容易 这里有2个概念需要考虑,第一个是自顶向下的设计,第二个是单责原则。就是不断地将问题分解成越来越小的部分,直到每个部分都很容易实现。各国: 每个模块、类或函数都应该对软件提供的功能的单个部分负责,并且该责任应该完全由该模块、类或函数封装int complete\u list\u数组(struct list*ptr,int*V,int*count)
您是否尝试过在调试器/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; }
- 创建节点(如上所示为