C 向列表中添加新节点时出现分段错误
搜索列表并尝试添加新节点时出现问题。 代码如下所示C 向列表中添加新节点时出现分段错误,c,list,C,List,搜索列表并尝试添加新节点时出现问题。 代码如下所示 struct sizelist{ int currentsize, origsize; struct sizelist * next; }; typedef struct sizelist item; 以下是内容的大小,items是连接的节点数,next是下一个节点 void firstfit(item tosort){ int junksize = tosort.currentsize; int paired;
struct sizelist{
int currentsize, origsize;
struct sizelist * next;
};
typedef struct sizelist item;
以下是内容的大小,items是连接的节点数,next是下一个节点
void firstfit(item tosort){
int junksize = tosort.currentsize;
int paired;
item* current;
for(int i=0;i<containeramount;i++){
if(containers[i].currentsize - junksize >=0){
paired = i;
break;
}
}
current = &containers[paired];
while(current->next!=NULL){
current = current->next;
}
containers[paired].currentsize = containers[paired].currentsize - junksize;
current->next = &tosort;
}
现在你也要了解这个程序了。
例如,我给它3个容器,每个容器的大小为10,东西的大小为6,8,1,5。它看起来像是firstfit
完成了它的任务,但是writeout
方法没有。
此处的正确输出应为:
1061
108
105
此处origsize的输出为:
103
103
103
对于currentsize,它是:
3134515941
2134515941
5134515941看起来代码的最新版本有了很大的改进, 但是
tosort
按值传递到firstfit(item tosort)
。
这意味着在函数firstfit(item tosort)
中,tosort
是一个临时函数
在函数末尾销毁的变量。
(这也是早期版本的程序,但我们
首先是其他问题。)
现在函数正在对实际内容进行处理
容器[成对的]而不是某个东西的临时副本,
正在设置列表中的最后一个next
指针(根据需要),
但它指向临时对象tosort
。
当函数结束时,tosort
超出范围。
据推测,在同一虚拟内存块中会写入其他内容
当你试图打印出来的时候,你的记忆
如果将函数更改为,这将更好地工作
firstfit(item*tosort)
,即传递指针而不是
结构。
这将表现得更像您期望的函数调用
在Java中的行为
注:以下备注适用于 问题中的代码已被修改,因此如下所示 这些建议
我发现代码中有太多明显的错误,很难跟踪 所有这些,但我怀疑分割错误在这里:
current = containers[paired];
for(int i=0;i<containers[paired].items;i++){
current = *current.next;
}
current=容器[成对];
对于(int i=0;我来看看Stackoverflow!你有没有稳定的方法来重现这个问题?初始值是什么?你是否尝试过使用调试器?请格式化你的代码以提高可读性。如果没有合适的容器,成对的
可能是未初始化的。用非法索引初始化它,比如说-1
,然后强制执行我的命令t后面有一个合法的索引。当你说current=containers[paires]
,你复制内容。如果你有一个链表,你需要指向现有项目的指针,而不是副本。同样,行current=*current.next
看起来是错误的。它应该是current=current->next
,并且current
应该是指向项目的指针。你确定对n进行计数是一个好主意吗节点中连接的节点数?AFAICT,这意味着如果在最后插入一个节点,您必须返回并增加列表中的每个节点计数,这可能是容易出现错误且效率低下的。谢谢,我可以用java编程,但我不懂指针样式。我现在编辑了第一篇文章,因为我有另一个问题,我确实这么做了我不明白了。
current = containers[paired];
for(int i=0;i<containers[paired].items;i++){
current = *current.next;
}