添加变量的段错误 [英] Segfault from adding a variable

查看:19
本文介绍了添加变量的段错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

诚然,我是一个纯 C 的新手,但这让我很困惑.我正在研究一个链表实现以供练习,我只是通过向 split_node 函数添加一个变量来得到一个段错误:

I'm admittedly a straight-C newbie, but this has got me stumped. I'm working on a linked list implementation for practice, and I'm getting a 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
", 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] = '';

    //int foo;
}

此代码编译(gcc -Wall -o list list.c)并运行良好:

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

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

但是如果我在 split_node 的末尾取消注释 int foo,编译并运行,我得到:

But if I uncomment int foo at the end of split_node, compile and run, I get:

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

gdb 给了我这个回溯:

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 would adding a variable definition cause a segfault? It appears to be smashing the content pointer of the newly created node. I'm confused; any help?

推荐答案

你需要动态分配你的节点(使用 malloc).

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

正如你所拥有的,你的新节点被声明在堆栈上.当 split 函数返回时,该新节点不再是有效内存.

As you have it, your new node is declared on the stack. When the split function returns, that new node is no longer valid memory.

添加变量会导致段错误,因为该变量会更改堆栈的布局,从而导致函数返回时的行为略有不同.

Adding a variable causes a segfault because that variable changes the layout of the stack causing slightly different behavior when the function returns.

这篇关于添加变量的段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆