C: free(): 无效指针中止(核心转储)

C: free(): invalid pointer Aborted (core dumped)

我有一个程序,我尝试在其中读取两行 40 个字符。当出现问题或程序结束时,我释放数组。

我收到一条错误消息 free():无效指针中止(核心已转储)

我觉得是上个循环的问题,但是解决不了

char *str = NULL;
size_t  capacity = 0;
char **maska;
int rMaska=2, cMaska = 40;
maska =(char**)malloc (rMaska*sizeof(*maska));
    
    
    for (int a = 0; a < rMaska; a++)
        maska[a]=(char *) malloc (cMaska*sizeof(**maska));

    i=0;
    printf("Maska:\n");
    while ( getline (&str, &capacity, stdin) != -1)
    {
        if (i==rMaska)
    {
        printf("incorrect entry.\n");
        for (int i = 0; i < rMaska; i++)
            free (maska[i]);
        free(maska);

        return 0;
    }   
        if( strlen(str) != (unsigned int) cMaska )
            {
                printf("incorrect entry.\n");
                
                for (int i = 0; i < rMaska; i++)
                    free (maska[i]);
                free(maska);
                    
                return 0;
            }
            
        for (int i = 0; i < cMaska-1; i++)
            {
                if ( (str[i] != '#') && (str[i] != '.') )
                {
                    printf("incorrect entry.\n");
                    for (int a = 0; a < rMaska; a++)
                        free (maska[a]);
                    free(maska);
                    
                    return 0;
                }
            }
        
        strcpy(maska[i], str);
        i++;
    }
    
    free(str);
    
    for (int i = 0; i < rMaska; i++)
        free (maska[i]);
    free(maska);
    

我怀疑 while 和 for 循环中使用的 i 变量搞砸了。 我会定义一个不同的变量在 while 循环中使用(而不是 i),事实上内部的 for 循环也使用它是非常混乱的,而且它也可能在以后产生错误。

顺便说一下,您没有释放 str 以防输入错误。

你检查你输入的字符串是否有 strlen 40,然后如果它对分配大小为 40 的数组元素执行字符串的 strcpy。但是 strcpy 也复制了尾随的 NUL,即它复制了 41人物。所以你就是,俗话说,在堆里拉屎