C 打印链表数据时出现分段错误

C 打印链表数据时出现分段错误,c,C,我正在写一个打印链表的小程序。此列表包含一个字符串和指向下一个节点的指针 我将链表传递给一个函数,该函数添加一个新节点并填充数据字段 当我返回到main函数并尝试打印列表内容时,我得到了segmentation fault error,尽管从函数add_节点我可以打印节点的内容 我希望能够向函数传递一个列表和一个字符串,并且函数必须使用我传递的字符串向列表中添加一个新节点 #include <stdio.h> #include <stdlib.h> #include &l

我正在写一个打印链表的小程序。此列表包含一个字符串和指向下一个节点的指针

我将链表传递给一个函数,该函数添加一个新节点并填充数据字段

当我返回到main函数并尝试打印列表内容时,我得到了segmentation fault error,尽管从函数add_节点我可以打印节点的内容

我希望能够向函数传递一个列表和一个字符串,并且函数必须使用我传递的字符串向列表中添加一个新节点

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

struct node
{
    char filename[25];
    struct node *next;
};

typedef struct node LISTNODE;
typedef LISTNODE *LISTNODEPTR;

void add_node(LISTNODEPTR *nFile, char *chaData);

int main (int argc, char *argv[])
{
    LISTNODEPTR nFile = NULL;

    printf("Printing list\n");

    add_node(&nFile, "file.txt");

    printf("%s\n", nFile->filename);

    free(nFile);

    return 0;
}

void add_node(LISTNODEPTR *nFile, char *chaData)
{
    LISTNODEPTR head = *nFile;
    LISTNODEPTR newNode;

    newNode = (LISTNODEPTR) malloc(sizeof (struct node));

    strcpy(newNode->filename, chaData);

    printf("%s\n", newNode->filename);

    newNode->next = head; //link next. newNode next points to head (beginning of the list). At this time (head & newNode)->2nd->3rd->NULL

    head = newNode;
}
#包括
#包括
#包括
结构节点
{
字符文件名[25];
结构节点*下一步;
};
typedef结构节点LISTNODE;
typedef LISTNODE*LISTNODEPTR;
void add_节点(LISTNODEPTR*nFile,char*chaData);
int main(int argc,char*argv[])
{
LISTNODEPTR nFile=NULL;
printf(“打印列表”);
添加_节点(&nFile,“file.txt”);
printf(“%s\n”,文件->文件名);
免费(nFile);
返回0;
}
void add_节点(LISTNODEPTR*nFile,char*chaData)
{
LISTNODEPTR head=*nFile;
LISTNODEPTR-newNode;
newNode=(LISTNODEPTR)malloc(sizeof(struct node));
strcpy(newNode->filename,chaData);
printf(“%s\n”,newNode->filename);
newNode->next=head;//链接next。newNode next指向head(列表的开头)。此时(head&newNode)->2nd->3rd->NULL
头=新节点;
}
输出: 打印列表 file.txt 分段故障

操作系统: Linux sisdvb02 2.6.35-28-server#49 Ubuntu SMP周二3月1日14:55:37 UTC 2011 x86_64 GNU/Linux


编译器:
add\u node()
函数中的gcc-Wall-o list list.c

nFile
。它仍然指向
NULL
,并且由于您尝试取消引用
NULL
,因此会出现分段冲突错误。顺便说一句,使用Valgrind来帮助您解决这些问题

将函数更改为以下内容:

void add_node(LISTNODEPTR *nFile, char *chaData)
{
    LISTNODEPTR head = nFile;
    LISTNODEPTR newNode;

    newNode = (LISTNODEPTR) malloc(sizeof (struct node));

    strcpy(newNode->filename, chaData);

    printf("%s\n", newNode->filename);

    newNode->next = head; //link next. newNode next points to head (beginning of the list). At this time (head & newNode)->2nd->3rd->NULL

    head = newNode;
    nFile = head;
}

您有一个指向null的指针。然后将其分配给另一个变量,使该变量现在指向null。然后分配内存并指向该内存。这不会改变原始指针仍然指向null的情况

将函数中的最后一行更改为

*nFile = head;
另外,如果您不想让缓冲区溢出错误更改为:

strncpy(newNode->filename, chaData, 25);
newNod->filename[24] = 0;
add_node()
中,您可以修改
head
变量,该变量是唯一的局部变量。这不会影响
main()
中的
nFile
变量-当控件返回到
main()
时,它仍然是
NULL
,这就是为什么会出现分段错误

add_node()
中的最后一行应该是:

     *nFile = newNode;

IMHO最重要的事情是学习如何调试这样的故障。使用
gdb
可以方便地了解程序在哪里崩溃以及程序的状态

$ gcc -Wall -g test.c -o test
$ gdb ./test
...
(gdb) run
...
Program received signal SIGSEGV, Segmentation fault.
...
(gdb) bt
#0  __strlen_sse2 () at ../sysdeps/x86_64/multiarch/../strlen.S:32
#1  0x00007ffff7aa783c in _IO_puts (str=0x0) at ioputs.c:37
#2  0x0000000000400612 in main (argc=1, argv=0x7fffffffe6a8) at test.c:24
(gdb) frame 2
#2  0x0000000000400612 in main (argc=1, argv=0x7fffffffe6a8) at test.c:24
24      printf("%s\n", nFile->filename);
(gdb) print nFile
$1 = (LISTNODEPTR) 0x0

bt
向我提供了回溯,向我显示了程序崩溃时的确切位置。从
print nFile
中我知道
nFile
仍然为空。为什么?您可以看到,您正在将
head=newNode
设置为
add_node
(分配给即将丢弃的临时变量)的最后一行,我假设您打算改为设置
*nfile=newNode
(通过指针分配给调用方的变量)。

仍然存在分段冲突。不正确的
add_node()
函数将错误归咎于使用
strncpy()
或建议,因为它没有附加
'\0'
字符感谢Anite,我只需添加最后一行nFile=head