【问题标题】:C segfault when looping over a list循环列表时出现C段错误
【发布时间】:2017-01-30 10:04:36
【问题描述】:

这是我的列表结构:

typedef struct Header {
  struct Header* next;
  char empty;
  int storageSize;
} Header;

我正在遍历一个列表以检查它有多少元素:

int listSize(Header* _header) {
  int count = 0;
  while(_header->next) {
    _header = _header->next;
    ++count;
  }

  return count;
}

到达列表末尾后我得到一个段错误。 但是,如果我将其更改为:

int listSize(Header* _header) {
  int count = 0;
  while(_header->next) {
    if(!_header->next) {
      _header = _header->next;
      ++count;
    }
    else
      break;
  }

  return count;
}

它没有段错误,但它显然也没有正确计算元素。

【问题讨论】:

  • 使用调试器。如果您在用尽所有其他调试工作后确实需要帮助,请提供minimal reproducible example
  • 我用的是lldb,但是用的时候没有segfault。
  • 你能补充一下你是如何建立你的名单的吗?
  • 我认为while(_header->next) { 应该是while(_header) {
  • @BenSmith 您的编辑使到目前为止的所有 cmets/answers 几乎毫无用处,您实际上是在问一个新问题,没有提供您的代码的最小示例。请花点时间了解您在此处被告知的内容,如果需要,请发布一个新问题,其中包含您的代码的改进版本和一个最小示例。谢谢。

标签: c list pointers while-loop segmentation-fault


【解决方案1】:

在我看来,只要您想创建一个新节点,就可以将 next 初始化为 0 或 *next 初始化为 0。

【讨论】:

    【解决方案2】:

    你的逻辑不正确。代码应该是这样 - 并注意 cmets

    int listSize(Header* header) {
      int count = 0;
        while (header) {             // We have a node to count
          ++count;                   // Count it
          header = header->next;     // And move to the next node 
        }
    
       return count;
     }
    

    【讨论】:

      【解决方案3】:

      改变这个:

      while(_header->next) {
      

      到这里:

      while(_header) {
      

      因为你想遍历你的列表,只要 current 节点不是NULL

      您遇到了分段错误,因为您试图获取 NULLnext 数据成员。

      感觉就像您将一个空列表传递给您的listSize(),即_headerNULL,而您正在尝试获取next 的数据成员NULL,因此是分段错误。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多