Realoc:拆分行时下一个大小无效

Realoc:拆分行时下一个大小无效,c,pointers,segmentation-fault,realloc,C,Pointers,Segmentation Fault,Realloc,我的代码将char*行拆分为char***cmds,首先是字符“|”,然后是空格,\n等。示例I/O: I:line=“ls-l/|唯一|排序” O:cmds={{“ls”、“-l”、“/”、NULL}、{unique、NULL}、{sort、NULL}、NULL} 现在,每当它到达第行时,*cmds=realloc(*cmds,nlines+1)超过1个字时会产生错误 ***/a.out中出错:realloc():下一个大小无效:0x000000000114c010***或 a.out:mal

我的代码将char*行拆分为char***cmds,首先是字符“|”,然后是空格,\n等。示例I/O:

I:
line=“ls-l/|唯一|排序”

O:
cmds={{“ls”、“-l”、“/”、NULL}、{unique、NULL}、{sort、NULL}、NULL}

现在,每当它到达第行时,
*cmds=realloc(*cmds,nlines+1)超过1个字时会产生错误

***/a.out中出错:realloc():下一个大小无效:0x000000000114c010***

a.out:malloc.c:2372:sysmalloc:Assertion(old_top==((mbinptr)((char*)和((av)->bins[(1)-1)*2])-(struct malloc chunk,fd)和&old_size==0)(无符号长)(无符号长)(无符号长)(无符号长)(struct mallu builtin offset)(struct sizoc chunk,fd+)(((struct mallu builtin builtin)offsetof(struct sizu chunk,fd+)和nextsu size==0)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长符号长)(无符号长)(无符号长)(无符号长)(无符号长)(无符号长-1))&&((旧_-top)->大小和0x1)&((无符号长)旧_-end和页面掩码)==0)失败。

任何帮助都将不胜感激,我已经花了好几个小时在上面了

void parse(char *line, char *** cmds)
{
printf("got line %s\n", line);
    size_t nlines = 0;
    *cmds =  NULL;

    while (*line != '\0') {
    nlines++;

        while (*line == ' ' || *line == '\t' || *line == '\n')
            *line++ = '\0'; 

        *cmds = realloc(*cmds, nlines+1);
        (*cmds)[nlines-1] = line; 
        (*cmds)[nlines] = NULL;    

        while (*line != '\0' && *line != ' ' && *line != '\t' && *line != '\n')
            line++;
    }
    **cmds = '\0';  
}

void parsePipe(char *line, char ***cmds)
{
    char *cmd = strtok(line, "|");
    int linesFound = 0;

    while (cmd != NULL) 
    {
       printf("Printing word -> %s\n", cmd);
       linesFound++; 
       parse(cmd, cmds++);

       cmd = strtok(NULL, "|");
    }

    printf("This string contains %d lines separated with |\n",linesFound);
}

void  main(void)
{
    char  line[1024];          
    char  **cmds[64] = {0};

    while (1) {    
        printf("lsh -> ");   
        gets(line);     
        printf("\n");
        parsePipe(line, cmds);  
    }
}
要修复的样本

void parse(char *line, char *** cmds){
    char *cp, *token;
    size_t nlines = 0;
    *cmds =  NULL;

    token = strtok_r(line, " \t\n", &cp);
    while (token) {
        nlines++;
        *cmds = realloc(*cmds, sizeof(char*)*(nlines+1));
        (*cmds)[nlines-1] = token;
        (*cmds)[nlines] = NULL;
        token = strtok_r(NULL, " \t\n", &cp);
    }
}

void parsePipe(char *line, char ***cmds){
    char *cp;
    char *cmd = strtok_r(line, "|", &cp);
    int i=0, linesFound = 0;

    while (cmd != NULL){
        //printf("Printing word -> %s\n", cmd);
        linesFound++; 
        parse(cmd, cmds++);
        cmd = strtok_r(NULL, "|", &cp);
    }
    //printf("This string contains %d lines separated with |\n",linesFound);
    *cmds = NULL;
}

int  main(void){
    char  line[1024];
    char  **cmds[64] = {0};
    int i;

    while (1) { 
        printf("lsh -> ");
        scanf("%1023[^\n]%*c", line);
        if(*line == '.' && !line[1])
            break;
        parsePipe(line, cmds);
        //test print
        for(i=0; cmds[i]; ++i){
            int j=0;
            while(cmds[i][j]){
                printf("'%s' ", cmds[i][j++]);
            }
            printf("\n");
        }
    }
    //deallocation
    return 0;
}

此处仅分配nlines+1字节:
*cmds=realloc(*cmds,nlines+1)。您需要为nlines+1指针留出空间。此外,
**cmds='\0
**cmds是指向字符的指针,而不是字符。那你能告诉我怎么修吗?我不知道怎么做,现在也没有时间去学习:/使用模式
p=realloc(p,N*sizeof*p)
。这将为
N
项分配空间,无论
p
指向什么。如果您画出所有字符缓冲区和指针在内存中的位置,您可能会发现更容易理解代码