【问题标题】:Segmentation fault, can you help me?分段错误,你能帮帮我吗?
【发布时间】:2011-09-07 17:12:50
【问题描述】:

尝试显示 (int) 类型的元素时出现分段错误

template <class T>
void Lista<T>::imprimir()
{
    NodoL *ptr = new NodoL;
    ptr->sig = pri->sig;
    cout << *ptr->sig->elem; //THIS DISPLAYS CORRECTLY
    cout << *ptr->sig->sig->elem; //SEGMENTATION FAULT
}

【问题讨论】:

  • 请贴出相关代码。 sig 是什么?答案是“你做错了”,但无法判断,因为你没有显示错误代码。
  • 我猜sig 是“siguiente”(或类似的)的缩写,西班牙语为“next”,这是链表的代码。但请澄清。
  • 您没有提供足够的信息来说明 NodoL 类的结构及其构造函数的作用。 NodoL->sig 应该初始化为什么?这很可能是由于构造函数中的类成员初始化不当造成的。
  • 为什么您的列表打印功能会创建一个new 列表节点?我相信您的导师会告诉您打印列表根本不应该修改列表。它不应该创造任何新的东西。它可能应该有一个循环,以便您可以打印任意大小的列表。

标签: c++ pointers segmentation-fault


【解决方案1】:

你确定 sig 不为 NULL 吗?

template <class T>
void Lista<T>::imprimir()
{
    NodoL *ptr = new NodoL;
    ptr->sig = pri->sig;
    cout << *ptr->sig->elem; //THIS DISPLAYS CORRECTLY
    if(ptr->sig == NULL || ptr->sig->sig == NULL)
       return;

    cout << *ptr->sig->sig->elem; //SEGMENTATION FAULT
}

【讨论】:

  • 通过您的简单检查,它返回了......这意味着我在挂钩之前的节点时做错了......感谢您的快速响应
  • 好吧,我在将第二个节点添加到我曾经拥有的列表时发现错误:ult->sig = nuevoNodo;但我将其更改为 ult->sig->sig = nuevoNodo; ult->sig = nuevoNodo;现在它可以按预期工作了。
  • 不错。如果您使用的是 linux,则可以启用核心转储。所以你可以使用 gdb 找出你的程序崩溃的地方
【解决方案2】:

您似乎有一个链接列表,其中sig 指向列表的下一个元素。您的代码分配了一个新节点并使其指向pri 中现有节点的尾部。如果您的列表一开始只有两个元素,那么当您尝试打印第三个元素时,此代码自然会崩溃,因为没有这样的东西。第一个元素是*ptr-&gt;elem,第二个元素是*pri-&gt;sig-&gt;elem

【讨论】:

  • 谢谢你,你是对的。添加新节点时列表未正确连接。
【解决方案3】:

确保elem 是一个可以取消引用的指针,并且它不是指向内存中的某个无效位置,或者它不是NULL。似乎您有某种类型的链表,并且您正试图访问与ptr 指向的当前节点相距两个节点的列表节点。该节点可能不存在,因此sig 是无效指针,或者节点成员elem 是无效指针。无论哪种方式,您都应该在尝试取消引用这么多步骤之前检查指针。事实上,这可能最好使用 for 循环之类的东西来完成,例如:

NodoL* temp = ptr;

for (int i=0; i < NUMBER; i++)
{
    if (temp->sig == NULL)
        break;

    temp = temp->sig;
}

cout << *temp->elem << endl;

这样,您将通过列表中您当前所在位置的某个 NUMBER 预先指定的节点,或者您将提前终止 for 循环,因为您已到达列表的末尾.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多