Segfault from adding a variable

I'm admittedly new to CC, but it puzzled me. I am working on implementing linked lists for practice, and I get segfault by simply adding a variable to the split_node function:

#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 content remaining with node, and the remainder being copied to the new node. (It doesn't yet truncate the first node 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;
}

This code compiles (gcc -Wall -o list list.c) and works fine:

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

But if I uncomment int fooat the end split_node, compile and run, I get:

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

gdb gives me this 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

Why does adding a variable definition cause segfault? It looks like it is breaking the content pointer of the newly created node. I am embarrassed; any help?

+2
source share
3 answers

You need to dynamically allocate your nodes (using malloc).

, node . split , node .

segfault, , .

+15

Nodes NULL, C , , ( calloc malloc). SoapBox .

0

Valgrind - . "valgrind myappname" , .

0

Source: https://habr.com/ru/post/1703714/


All Articles