【问题标题】:Add list of Strings to LinkedList将字符串列表添加到 LinkedList
【发布时间】:2017-10-09 08:26:54
【问题描述】:

我正在尝试实现一个链表,但在向其中添加字符串数组时遇到了一些麻烦。它第一次添加没有问题,但如果我再次调用我的插入函数,我会收到“分段错误: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;
}

谢谢。

【问题讨论】:

  • (*nodes)-&gt;args[i]=strdup(argsNode[i]); - 调用未定义的行为。您忘记为args 分配指针床。 (*nodes)-&gt;args = malloc(nArgs * sizeof(char*)); 不见了。
  • @kuro 感谢您的回答,但没有奏效。还是一样的错误。
  • @WhozCraig 我的回答是给在你之前回答的用户 kuro。你的回答解决了它。
  • 优秀。很高兴它有帮助。 eyalm 的答案中的调试器演练示例本身就值得一票,它指出了突出的问题。就个人而言,我会接受。

标签: c linked-list malloc


【解决方案1】:

有一些问题。

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

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

您将看到确切的故障线

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

【讨论】:

  • 不知道使用递归是一个坏主意,将修复它。感谢您提供有关调试器的示例,我们会更好地了解它!
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2018-08-12
  • 2014-07-05
  • 2014-04-24
  • 2022-07-28
  • 2011-12-15
相关资源
最近更新 更多