循环遍历列表时出现C段错误

时间:2016-09-22 01:00:25

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

这是我的列表结构:

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

它不会出现段错误,但它显然也不能正确计算元素。

3 个答案:

答案 0 :(得分:2)

改变这个:

Θ(n)

到此:

while(_header->next) {

因为您希望遍历列表,只要当前节点不是while(_header) {

您遇到了细分错误,因为您试图获取NULL的{​​{1}}数据成员。

感觉您正在向您的next传递空列表,即NULLlistSize(),您正试图获取_header的{​​{1}}数据成员,因此是分段错误。

答案 1 :(得分:0)

你的逻辑不正确。代码应该是这个 - 并注意评论

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

答案 2 :(得分:-1)

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