Frage

Ich bin zugegebenermaßen ein straight-C Neuling, aber das hat mich stumped bekommt. Ich arbeite an einer verknüpften Liste Umsetzung für die Praxis, und ich bin immer einen segfault indem Sie einfach eine Variable in die split_node Funktion hinzufügen:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct Node {
    struct Node *child;
    char *content;
};

void print_list(struct Node node);
void split_node(struct Node *node, int position);

int main() {

    struct Node head, second, third;

    head.content = "first";
    second.content = "second";
    third.content = "i'm third";

    head.child = &second;
    second.child = &third;

    print_list(head);
    split_node(&head, 3);
    print_list(head);

    return 0;
}

void print_list(struct Node node) {
    printf("%s\n", node.content);
    if(node.child) print_list(*node.child);
}

    /*
    Split node into two nodes, with the first position characters of the node's content remaining with node, and the remainder being copied to the new node. (It doesn't yet truncate the first node's string, but does do the copy.)
    */
void split_node(struct Node *node, int position) {
    if(position >= strlen((*node).content)) return;
    struct Node newNode;
    newNode.child = (*node).child;
    (*node).child = &newNode;

    int length = (strlen((*node).content) - position);
    newNode.content = malloc(sizeof(char) * (length + 1));
    strncpy(newNode.content, (*node).content + sizeof(char) * position, length);
    newNode.content[length] = '\0';

    //int foo;
}

Dieser Code kompiliert (gcc -Wall -o Liste list.c) und läuft gut:

$ ./list
first
second
i'm third
first
st
second
i'm third

Aber wenn ich int foo am Ende split_node Kommentar-, kompilieren und ausführen, erhalte ich:

$ ./list
first
second
i'm third
first
st
Segmentation fault

gdb gibt mir diese Backtrace:

#0  0x91d6ae70 in strlen ()
#1  0x91dd3126 in puts ()
#2  0x00001f21 in print_list (node={child = 0xbcec815b, content = 0x8b000000 <Address 0x8b000000 out of bounds>}) at list.c:41
#3  0x00001f3c in print_list (node={child = 0x8fe0154b, content = 0x1ff6 "i'm third"}) at list.c:42
#4  0x00001f3c in print_list (node={child = 0xbffff568, content = 0x1fef "second"}) at list.c:42
#5  0x00001f3c in print_list (node={child = 0xbffff570, content = 0x1fe9 "first"}) at list.c:42
#6  0x00001ee0 in main () at list.c:33

Warum sollte das Hinzufügen einer Variablendefinition ein segfault verursachen? Es scheint, den Inhalt Zeiger des neu erstellten Knoten zu zerschlagen. Ich bin verwirrt; jede mögliche Hilfe?

War es hilfreich?

Lösung

Sie müssen sich dynamisch Ihre Knoten (mit malloc) zuzuweisen.

Wie haben Sie es, Ihren neuen Knoten auf dem Stapel deklariert. Wenn die Split-Funktion zurückkehrt, dass neue Knoten ist nicht mehr gültig Speicher.

eine Variable Hinzufügen bewirkt eine segfault weil diese Variable das Layout des Stapels ändert verursacht leicht unterschiedliches Verhalten, wenn die Funktion zurück.

Andere Tipps

Versuchen Sie, den Knoten Kind-Eigenschaft auf NULL Einstellung, C automagically Null Speicher nicht aus, so sieht es aus wie Ihr Müll in Kind haben kann (oder Ihr calloc statt malloc verwenden könnte). SoapBox Antwort ist auch richtig.

Valgrind ist ein großes Werkzeug, um diese Art von Problemen zu finden. Sie können nur „valgrind myappname“ tun von der Kommandozeile und es wird Ihnen Details geben auf diese Art von Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top