将字符串列表添加到LinkedList

时间:2017-05-10 15:22:06

标签: c linked-list malloc

我试图实现链接列表,但是在添加字符串数组时遇到了一些麻烦。它第一次添加没有任何问题,但如果我再次调用我的插入函数,我会得到一个"分段错误:11"错误。

以下是代码:

typedef struct node_s{
    int id;
    char *cmd;
    char **args;
    int numArgs;
    int connected;
    struct node_s *next;
}node;

typedef node *NODES;

void insert(NODES *nodes, int idNode, char *cmdNode,char **argsNode, int nArgs,int conn){
    int i;

    if (!exist(*nodes,idNode))
    {
        if(*nodes==NULL){ 
            *nodes = (NODES) malloc(sizeof(struct node_s)); 
            if(*nodes==NULL) 
            {
                perror("malloc err");
                return;
            }

            (*nodes)->id = idNode;
            (*nodes)->cmd = strdup(cmdNode);
            // Problem
            for(i=0;i<nArgs;i++)
                (*nodes)->args[i]=strdup(argsNode[i]); 
            (*nodes)->numArgs=nArgs;
            (*nodes)->connected=conn;
            (*nodes)->next = NULL; 
        }
        else
            insert(&(*nodes)->next,idNode,cmdNode,argsNode,nArgs,conn); 

    }
}

int main()
{
    char *cmds[4]={"wc", "-l", "another","hello.com"};
    NODES nodes;    
    inicNodes(&nodes);
    insert(&nodes,1,"wc",cmds,4,0);
// if i try to list my values here it shows them as expected.       
    insert(&nodes,3,"ls",cmds,4,1);

    return 0;
}

谢谢。

1 个答案:

答案 0 :(得分:3)

有一些问题。

您必须初始化列表的头部:

NODES nodes = NULL;

您没有分配args数组:

(*nodes)->args = malloc(sizeof(char *)*nArgs)

如果您想确定崩溃的位置,请使用调试器:

# gdb ./prog
(gdb) run

Program received signal SIGSEGV, Segmentation fault.
0x00000000004006e9 in insert (nodes=0x7fffffffdc98, idNode=1, 
    cmdNode=0x40088f "wc", argsNode=0x7fffffffdca0, nArgs=4, conn=0) at    qq.c:33
33                  (*nodes)->args[i]=strdup(argsNode[i]); 

坠机后:

(gdb) backtrace

您将看到确切的错误行

另一件事。使用递归进行链表插入是不现实的。它会很快达到堆栈限制。