Ошибка сегментации, и я не знаю, что ее вызывает - PullRequest
0 голосов
/ 30 апреля 2011
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(), чтобы выдать результат здесь?Ошибка сегментации каким-то образом останавливает его работу даже до того, как ошибка возникнет.

Ответы [ 2 ]

5 голосов
/ 30 апреля 2011

Прежде всего, я немного исправил ваш отступ и добавил несколько аннотаций.

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.

Последующей попыткой отмены ссылки является ошибка сегмента.

1 голос
/ 30 апреля 2011

Скорее всего, проблема будет во втором cur = cur->next;, который следует за циклом while - в этот момент цикл гарантирует, что cur == NULL.

Я не уверен, что вы пытаетесь сделать в этой функции (какой-то код был пропущен для примера?), Поэтому на самом деле у меня нет предложений в данный момент.

Кроме того, как показывают предупреждения вашего компилятора, функция ничего не возвращает, даже если она объявлена ​​так. Я бы снова предположил, что это потому, что что-то удалено для целей примера в вопросе, но опять же ваш компилятор также жалуется. Любой вызывающий объект, который использует все функции, которые он должен вернуть, ожидает сюрприз. Этот сюрприз также может быть причиной ошибки.

...