遍历导致分段错误的链接

Iterating through links causing 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 值?

在您的代码中,

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

    如果 in->page 为 NULL,将出现段错误。

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

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

    将出现段错误。

因为 NULL 指针取消引用(在运行时,具体来说)调用 undefined behaviour.

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


我想你没给我们展示几个 typedef,否则你的代码将无法编译。

在您的代码中,

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 吗?

顺便说一句,如果没有我指出的更改,您的代码将无法编译。如果我假设您有 typedefd 它们并且没有在此处添加该部分,那么在运行时您的代码将最终收到 SIGSEGV 即如果 inlink->next->page 为 NULL 或 [=19 则出现分段错误=] 为 NULL。