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;
    }