main.c:132:26: warning: "/*" within comment
main.c: In function ‘importSettings’:
main.c:152: warning: control reaches end of non-void function
main.c: In function ‘cs_init_missions’:
main.c:84: warning: control reaches end of non-void function
j@jonux:~/Projects/csgtk/c$ ./a.out
Segmentation fault
j@jonux:~/Projects/csgtk/c$
这是使用-Wall编译并运行程序的输出。不理想。
错误似乎涉及以下代码。
static xmlDocPtr importSettings(char file[], GtkBuilder *builder) {
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if(xmlStrEqual(cur->name, (const xmlChar *) "options")) {
cur = cur->xmlChildrenNode;
while (cur != NULL) {
cur = cur->next;
}
}
cur = cur->next;// <- Segfault is here
}
}
当cur
导致段错误时,外环似乎试图将cur->next
设置为cur == NULL
。是否有可能重建循环以避免这种情况? (我想到了一个do-while循环,但没有成功)
避免这种情况的唯一方法是将语句包含在if语句中吗?
我已经尝试过修复问题的方法。我理解为什么它首先失败了,但鉴于下面的输出它仍然失败:
static xmlDocPtr importSettings(char file[], GtkBuilder *builder){
if (file == NULL) {
file = "CsSettings.xml";
}
//commented stuff here
settingsTree = xmlParseFile(file);
//commented stuff here
cur = xmlDocGetRootElement(settingsTree);
cur = cur->xmlChildrenNode;
while (cur != NULL){
if(xmlStrEqual(cur->name, (const xmlChar *) "options")){
cur = cur->xmlChildrenNode;
while (cur != NULL){
//commented stuff here
if(cur->next == NULL)
cur = cur->parent;
else
cur = cur->next;
}
}
cur = cur->next;
}
}
有没有办法让printf()
在这附近输出?即使在故障发生之前,分段故障也会以某种方式阻止它运行。
答案 0 :(得分:5)
首先,我稍微修改了缩进并添加了一些注释。
static xmlDocPtr importSettings(char file[], GtkBuilder *builder){
cur = cur->xmlChildrenNode;
while (cur != NULL){
if(xmlStrEqual(cur->name, (const xmlChar *) "options")){
cur = cur->xmlChildrenNode;
while (cur != NULL){
cur = cur->next;
}
//at this point, cur == NULL
}
cur = cur->next;//seg fault here
}
}
问题是当if
语句为真时,您会运行第二个while循环,使cur
等于NULL
。
随后的取消引用尝试是seg错误。
答案 1 :(得分:1)
问题很可能出现在cur = cur->next;
循环之后的第二个while
- 此时循环已经保证cur == NULL
。
我不确定你在这个函数中想要做什么(有一些代码被省略了吗?),所以暂时没有建议。
此外,正如您的编译器警告所示,即使声明这样做,函数也不会返回任何内容。我会再次假设这是因为在问题中为了示例的目的删除了某些东西,但是你的编译器也在抱怨。任何使用函数应该返回的调用者都会感到惊讶。这个惊喜也可能是一个段落错误。