迭代链接导致分段错误

时间:2015-05-26 09:52:32

标签: c linked-list segmentation-fault

我有以下结构:

struct page {
    int index;
    int noutlinks;
    node* inlinks;
    char name[MAX_NAME];
};

struct node {
    page* page;
    node* next;
};

struct config {
    node* list;
};

从这个结构中,我使用以下代码来调用样本测试中存储的所有值。

void DumpInfo(node* list){
    for (node* iter = list; iter != NULL; iter = iter->next) {

        if(iter->page->inlinks == 0){
            result = first + dampener * 0;

        }

        printf("PAGE: %s ", iter->page->name);
        printf("INDEX: %zd ", iter->page->index);
        printf("IN: %zd ", iter->page->inlinks);
        printf("OUT: %zd ", iter->page->noutlinks);


    }

当我打印出来时,我得到以下值

PAGE: A INDEX: 0 IN: 6972112 (B, D) OUT: 0
PAGE: B INDEX: 1 IN: 6972048 (D)    OUT: 2
PAGE: C INDEX: 2 IN: 6972144 (B, D) OUT: 0
PAGE: D INDEX: 3 IN: 0              OUT: 3

对于页面A,它包含页面B,D的INPUT。我想要实现的是从B和D获取OUT值。

我已经尝试过下面的代码,它似乎抓住了错误的输出,然后崩溃并出现了分段错误

int res = 0;

        for(node* in = list; in != NULL; in = in-> next){
            node* inlink = in->page->inlinks;
            res = inlink->next->page->noutlinks;
            printf("RESULT: %d\n", res);
        }

如何在不导致分段错误的情况下获取每个输入的out值?

2 个答案:

答案 0 :(得分:0)

在您的代码中,

  1. node* inlink = in->page->inlinks;

    如果in->page为NULL,

    将会出现段错误。

  2. inlink->next->page->noutlinks;

    如果inlinkinlink->nextinlink->next->page为NULL,

    将会出现段错误。

  3. 因为,NULL指针取消引用(在运行时,是特定的)调用undefined behaviour

    解决方案:在解除引用之前为指针添加NULL检查。

    我认为你错过了向我们展示了几个typedef,没有它们,你的代码将无法编译。

答案 1 :(得分:-1)

在您的代码中,

struct page {
    int index;
    int noutlinks;
    node* inlinks;
    char name[MAX_NAME];
};

struct node {
    page* page;
    node* next;
};

struct config {
    node* list;
};

(假设您没有typedef写的)page* page;struct page* page,并且 应该node* next;struct node* next吗?

顺便说一下,如果没有我指出的更改,你的代码就无法编译。如果我假设您有typedef d并且未在此处添加该部分,那么在运行时期间,如果SIGSEGV为NULL或{{1},则代码将最终收到inlink->next->page,即分段错误是NULL。