【问题标题】:C Structure Segment OverflowC 结构段溢出
【发布时间】:2014-11-26 18:46:12
【问题描述】:

我有一个用 C 语言编写的程序,它创建一个由两部分组成的单链表。
我使用结构来生成列表、节点和节点数据。 其中结构被定义为

struct TList {
    struct LNode* first;
    struct LNode* last_left;
};

struct LNode {
    struct LData* data;
    struct LNode* next;
};

列表看起来像[ A B C ][ D E ] 在哪里, list->first = "A"list->last_left = "C"

以下函数重置链表中的光标。

void reset_list_cursor(struct TList *list) {

    struct LNode *temp, *temp1, *temp2;
    int i = (list_left_size(list) - 1 );

    for (i; i >= 0; i--) {

        temp = list->last_left;
        temp1 = list->first;

        if (temp != NULL) {

            temp2 = temp1->next;
            while (temp2 != temp) {
                temp1 = temp1->next; 
                temp2 = temp2->next;
            }

            list->last_left = temp1;
        }
    }
    list->last_left = NULL;
}

但是,我遇到了分段错误,我已将其范围缩小到以下几行...

void reset_list_cursor(struct TList *list) {

    temp1 = temp1->next; 
    temp2 = temp2->next;

我知道你永远不能调用 temp = temp->next->next,但是当你创建一个结构来代替 temp->next 时,它不应该工作吗?

【问题讨论】:

  • 如果 temptemp->next 不为 NULL(或更准确地说,已知为有效),temp = temp->next->next; 在语法上是有效且安全的。
  • 这意味着您取消了对 NULL 的引用。先不要检查NULL,你可以避免它。
  • MCVE 会很有帮助。

标签: c pointers linked-list structure


【解决方案1】:

首先,temp -> next -> next 没有任何问题,它在语法上也是正确的。在任何涉及循环的情况下,您必须确保在进入它时检查“下一个”是否为空。包括一个条件,当您进入循环时检查是否 temp -> next == NULL。这将为您创造奇迹。

类似于while(temp1->next!=NULL && temp2->next!=NULL)

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 2015-09-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2023-01-08
    • 2021-07-12
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多