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

3
我有一个函数,它接受一个字符串数组。它通过特定字符的存在来分离所有这些字符串,这种情况下是'|'。请参见我的先前问题基于字符拆分字符串数组以获得更好的理解。
所以,我有一个看起来像这样的字符串数组:
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;

}

代码中哪里发生了故障? - Scott Hunter
1
command[i] = (char *)malloc(sizeof(args[i])); 翻译为 command[i] = malloc(strlen(args[i]) + 1); —— sizeof(args[i]) 是指向字符串的 char * 的大小,而不是它所指向的字符串的长度。 - Dmitri
另外... while(strcmp(args[i],"|") != 0) { 应该改为检查 args 的结尾以及 "|"。你需要知道 args 中字符串的数量,或者在 args 的末尾放置一个 NULL 来标记结尾。 - Dmitri
2个回答

3
您从未为node_cmds的cmnd成员分配任何内存。因此,行strcpy(currNode->cmnd[j], command[j]);正在写入...某个地方。很可能是您不拥有的内存。当您添加那些malloc时,第二次通过外部for循环进行索引(使用j)将非常不正确。
另外,您正在像筛子一样泄漏内存。尝试在其中添加一些自由空间。

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

}

在这个语句中,您还没有为cmnd指针(字符串)分配内存。我相信这可能是导致问题的一部分。您已经为结构体分配了内存,但还需要为结构体中的每个指针分配内存。

这绝对是我的代码问题。我确保分配了内存,现在似乎一切都正常了。 - user2030942

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接