我有以下结构:
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的输入。我想要实现的是从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: %dn", res);
}
如何在不引起分割故障的情况下获取每个输入的out值?
在您的代码中,
-
如果node* inlink = in->page->inlinks;
in->page
为NULL,将出现段故障。
-
如果inlink->next->page->noutlinks;
inlink
,inlink->next
或inlink->next->page
为NULL,将出现分段故障。
因为NULL指针解引用(运行时,具体来说是)会调用未定义行为。
解决方法:在解引用前为指针添加NULL检查。
我想你缺少了几个typedef
s,没有它们,你的代码将无法编译
在您的代码中,
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
即分割故障,如果inlink->next->page
是NULL或inlink->next
是NULL。