分段错误 - 查找列表的根

Segmentation fault - finding the root of a list

本文关键字:列表 查找 错误 分段      更新时间:2023-10-16

我在运行以下代码时遇到分段错误。我知道我对这里的指针有一些基本的误解,但我似乎无法弄清楚。

#include <iostream>
using namespace std;
struct intptr{
  intptr* a;
  int value;
};
void printint(intptr q){
  if (q.a == &q){
    cout<<q.value<<endl;
    return;
  }
  else
    printint(*(q.a));
}
int main(){
  intptr y,z;
  z.value = 1;
  y.value = 2;
  *(y.a) = z;
  *(z.a) = z;
  printint(x);
}

我也尝试过以下方法,但它从未认识到q.a = &q是正确的。

#include <iostream>
using namespace std;
struct intptr{
  intptr* a;
  int value;
};
void printint(intptr q){
  if (q.a == &q){
    cout<<q.value<<endl;
    return;
  }
  else
    cout<<"not finished"<<endl;
    printint(*(q.a));
}
int main(){
  intptr y,z;
  z.value = 1;
  y.value = 2;
  y.a = &z;
  z.a = &z;
  printint(y);
}

这是你的问题:

  *(y.a) = z;
  *(z.a) = z;

您正在取消引用null pointera变量从未初始化,并且不指向任何内容。如果您要使用指针,我强烈建议您遵循 3 法则。

为了找到问题并避免将来出现类似问题,建议初始化指向 NULL 的指针,并在操作它们之前检查 NULL。我建议您在结构中添加一个构造函数并初始化指针 a:

struct intptr
{
   intptr* a;
   int value;
   intptr()
   : a(NULL)
   { }
};

这个问题已经被@awesomeyi指出

请尝试以下代码:

  y.a = &z;
  z.a = &y;