C 字符串数组链表-分段错误

C 字符串数组链表-分段错误,c,C,我有一个接受字符串数组的函数。它通过一个特定字符的存在来分隔所有这些字符串,在本例中为“|”。请参阅我的上一个问题以了解更好的想法 我有一个字符串数组,如下所示: char ** args = {"ls", "-l", "|", "cd", "."} 我的parseCmnds函数应该遍历数组中的每个字符串,并创建一个新的字符串数组,其中所有字符串都位于“|”字符之前。然后它创建一个链表,其中每个节点指向我创建的每个字符串数组,基本上将原始字符串数组分隔为相互链接的单独字符串数组 因此,我的解析

我有一个接受字符串数组的函数。它通过一个特定字符的存在来分隔所有这些字符串,在本例中为“|”。请参阅我的上一个问题以了解更好的想法

我有一个字符串数组,如下所示:

char ** args = {"ls", "-l", "|", "cd", "."}
我的parseCmnds函数应该遍历数组中的每个字符串,并创建一个新的字符串数组,其中所有字符串都位于“|”字符之前。然后它创建一个链表,其中每个节点指向我创建的每个字符串数组,基本上将原始字符串数组分隔为相互链接的单独字符串数组

因此,我的解析循环应该创建如下内容,例如:

在第一次迭代中: char**command={“ls”,“-l”,NULL}

关于第二次迭代 char**command={“cd”,“,”,NULL}

每次迭代后,我的函数都会创建一个新的链表节点并填充它。我根据上一个问题的一些答案构建了代码(非常感谢)。但由于某种原因,我遇到了一个无法理解的分割错误。有人能检查一下我的代码,让我知道我做错了什么吗

typedef struct node {
    char ** cmnd; 
    struct node * next;
} node_cmnds;

node_cmnds * parseCmnds(char **args) {
    int i; 
    int j=0; 
int numArgs = 0;
node_cmnds * head = NULL; //head of the linked list
head = malloc(sizeof(node_cmnds));
if (head == NULL) { //allocation failed
    return NULL;
}
else {
    head->next = NULL; 
}

node_cmnds * currNode = head; //point current node to head

for(i = 0; args[i] != NULL; i++) { //loop that traverses through arguments
    char ** command = (char**)malloc(maxArgs * sizeof(char*)); //allocate an array of strings for the command

    if(command == NULL) { //allocation failed
        return NULL;
    }

    while(strcmp(args[i],"|") != 0) { //loop through arguments until a | is found
        command[i] = (char*)malloc(sizeof(args[i])); //allocate a string to copy argument
        if(command[i] == NULL) { //allocation failed
            return NULL;
        }
        else {
            strcpy(command[i],args[i]); //add argument to our array of strings
            i++;
            numArgs++;
        }
    }

    command[i] = NULL; //once we find | we set the array element to NULL to specify the end

    while(command[j] != NULL) {
        strcpy(currNode->cmnd[j], command[j]);
        j++;

    }


    currNode->next = malloc(sizeof(node_cmnds));
    if(currNode->next == NULL) {
        return NULL;
    }
    currNode = currNode->next; //
    numArgs = 0;

} 

return head;

}

您从未为
node\u cmds
cmnd
成员分配任何内存。因此,行
strcpy(currNode->cmnd[j],command[j])正在向…某处写信。很可能是你没有的记忆。当您添加这些
malloc
s时,您的索引(使用
j
)在第二次通过外部
for
循环时将非常不正确

而且,你正在像筛子一样漏掉内存。试着在那里扔一些免费的

while(command[j] != NULL) {
    strcpy(currNode->cmnd[j], command[j]);
    j++;

}

在此语句中,您尚未为cmnd指针(字符串)分配内存。我相信这可能是造成你的部分问题的原因。您已经为结构分配了内存,但也需要为结构中的每个指针分配内存。

在代码中,设置错误发生在哪里?
command[i]=(char*)malloc(sizeof(args[i])-->
命令[i]=malloc(strlen(args[i])+1)
--
sizeof(args[i])
char*
的大小,而不是它所指向的字符串的长度。另外
while(strcmp(args[i],“|”)=0){
应更改为检查
args
的结尾以及
“|”
。您需要知道
args
中的字符串数,或者在
args
的末尾有一个
NULL
来标记结束。这肯定是我的代码的问题。我确保分配了内存,现在一切似乎都正常了。