我有以下结构:
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值?
答案 0 :(得分:0)
在您的代码中,
node* inlink = in->page->inlinks;
in->page
为NULL,将会出现段错误。
inlink->next->page->noutlinks;
inlink
,inlink->next
或inlink->next->page
为NULL,将会出现段错误。
因为,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。