我试图实现链接列表,但是在添加字符串数组时遇到了一些麻烦。它第一次添加没有任何问题,但如果我再次调用我的插入函数,我会得到一个"分段错误: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;
}
谢谢。
答案 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
您将看到确切的错误行
另一件事。使用递归进行链表插入是不现实的。它会很快达到堆栈限制。