遍历导致分段错误的链接
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 值?
在您的代码中,
node* inlink = in->page->inlinks;
如果 in->page
为 NULL,将出现段错误。
inlink->next->page->noutlinks;
如果 inlink
、inlink->next
或 inlink->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
吗?
顺便说一句,如果没有我指出的更改,您的代码将无法编译。如果我假设您有 typedef
d 它们并且没有在此处添加该部分,那么在运行时您的代码将最终收到 SIGSEGV
即如果 inlink->next->page
为 NULL 或 [=19 则出现分段错误=] 为 NULL。
我有以下结构:
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 值?
在您的代码中,
node* inlink = in->page->inlinks;
如果
in->page
为 NULL,将出现段错误。
如果inlink->next->page->noutlinks;
inlink
、inlink->next
或inlink->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
吗?
顺便说一句,如果没有我指出的更改,您的代码将无法编译。如果我假设您有 typedef
d 它们并且没有在此处添加该部分,那么在运行时您的代码将最终收到 SIGSEGV
即如果 inlink->next->page
为 NULL 或 [=19 则出现分段错误=] 为 NULL。