【问题标题】:C: free(): invalid pointer Aborted (core dumped)C: free(): 无效指针中止(核心转储)
【发布时间】:2021-03-11 01:03:35
【问题描述】:

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

我收到一条错误消息 free(): invalid pointer Aborted (core dumped)

我认为问题出在最后一个循环,但我无法解决。

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);
    

【问题讨论】:

  • str 是什么?请贴出读者可以编译的代码。
  • 欢迎来到 SO。与您的问题无关,但您真的不应该使用大量同名的变量。您至少有 5 个变量称为 i。对于外层,缺少定义。
  • 您的意见是什么?你什么时候收到错误信息?什么是capacity? 请提供MCVE
  • 我已经在那里添加了这些变量。
  • 请注意,您有多个名为 i 的变量。这很混乱。

标签: arrays c malloc free realloc


【解决方案1】:

我怀疑 while 和 for 循环中使用的 i 变量把它搞砸了。 我会定义一个不同的变量在 while 循环中使用(而不是 i),事实上里面的 for 循环也使用它是非常令人困惑的,而且它也会在以后产生错误。

顺便说一句,如果输入不正确,您并没有释放str

【讨论】:

    【解决方案2】:

    您检查输入的字符串 strlen 是否为 40,然后如果它已将该字符串的 strcpy 到分配大小为 40 的数组元素。但是 strcpy 也会复制尾随的 NUL,即它复制 41 个字符。俗话说,你就是在堆里拉屎

    【讨论】:

    • 但如果输入的长度为 40,它应该达到条件 if( strlen(str) != (unsigned int) cMaska ) 然后有一个合适的 free 或者我错过了什么?
    • csavvy 我认为你错过了如果 strlen(s) 为 N,strcpy(dest, s) 复制 N+1 个字符。 strlen 不包括尾随的 NUL aka 0
    猜你喜欢
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多