Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 程序中的内存泄漏_Arrays_C_Pointers_Memory Leaks_Malloc - Fatal编程技术网

Arrays 程序中的内存泄漏

Arrays 程序中的内存泄漏,arrays,c,pointers,memory-leaks,malloc,Arrays,C,Pointers,Memory Leaks,Malloc,我需要关于程序中哪里没有释放分配的内存的建议。在我看来,它在评论部分的某个地方,以这种形式是为了编译我 在这里,在某种程度上,我用记忆工作,并试图释放它 写入自由(对角)时在if(nr中,我很确定这个答案永远不会被阅读,但无论如何 问题是您没有对角初始化。因此,如果您提供空行作为第一行,它将指向内存中的随机位置,free()可能会使程序崩溃 解决方案是记住初始化指针: char**对角线=NULL; 当然,你不应该做free(对角[0]),因为nr是0,这意味着对角取消引用是错误的。您真的应该

我需要关于程序中哪里没有释放分配的内存的建议。在我看来,它在评论部分的某个地方,以这种形式是为了编译我

在这里,在某种程度上,我用记忆工作,并试图释放它

写入
自由(对角)时在if(nr中,我很确定这个答案永远不会被阅读,但无论如何

问题是您没有对角初始化
。因此,如果您提供空行作为第一行,它将指向内存中的随机位置,
free()
可能会使程序崩溃

解决方案是记住初始化指针:

char**对角线=NULL;

当然,你不应该做
free(对角[0])
,因为
nr
0
,这意味着对角取消引用
是错误的。

您真的应该提供一个。缺少的函数可能是问题所在,但我没有检查。使用VS,我只检查哪个分配没有被释放。另一个建议是将对角分配器和deallocator包装在两个函数中NS.OK,让我们看看VS,其他函数只检查加载的字符串,没有内存使用ValgRink。它会告诉你,哪里发生内存泄漏。我真的不明白为什么你不编辑帖子并提供它。它会提高你得到答案的机会,这将解决你的问题!什么是输入?什么?是预期的输出吗?它对哪个输入崩溃?
int main (void)
{
    char **diagonaly;
    char **docasne;
    int rDiagonaly = 10;
    int cDiagonaly = -1;

    char *str = NULL;
    size_t  capacity = 0;
    int first = 1;
    int nr = 0;
    
    printf("Vypln:\n");
    while ( getline (&str, &capacity, stdin) != -1)
    {
        if(str[0] == '\n')
                break;
        //valid control
        if ( !validni(str, cDiagonaly) )
        {
            printf("Nespravny vstup.\n");
            for (int i = 0; i < nr; i++)
                free (diagonaly[i]);
            free(diagonaly);
            free(str);
            return 0;
        }
        
        if (first)
        {
            cDiagonaly = strlen (str)+1;
            diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly);
            first = 0;
        }   
        
        if (nr==rDiagonaly)
            {
                rDiagonaly *= 2; 
                docasne = (char**)realloc (diagonaly, rDiagonaly*sizeof(*diagonaly));
                diagonaly=docasne;
            }
        
        diagonaly[nr]=(char*) malloc (cDiagonaly*sizeof(**diagonaly));
        strcpy(diagonaly[nr],str);
        
        nr++;
        
    }

    if(nr<=0 )
    {
        printf("Nespravny vstup.\n");
        free(str);
                //free (diagonaly[0]);
            //free(diagonaly);
            return 0;
        return 0;
    }   
    
    rDiagonaly = nr;
    char **maska;
    int rMaska = nr+1;
    int cMaska = cDiagonaly+1;
    str = NULL;
    capacity = 0;
    

    nr=0;
    
    maska=(char**)malloc (rMaska*sizeof(*maska));
    for (int i = 0; i < rMaska; i++)
        maska[i]=(char *) malloc (cMaska*sizeof(**maska));
    
    printf("Maska:\n");
    while ( getline (&str, &capacity, stdin) != -1)
    {
        
        if(nr == rMaska)
        {
            printf("Nespravny vstup.\n");
            
            for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
            
            
            return 0;
        }
        //valid control
        if ( validniM(str, cMaska) )
        {
            strcpy(maska[nr],str);
        }
        else
        {
            printf("Nespravny vstup.\n");
            for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
            return 0;
        }
        nr++;
    }
    
    if (nr != rMaska)
    {
        printf("Nespravny vstup.\n");
        for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
            free(str);
        return 0;
    }   


    for (int i = 0; i < rDiagonaly; i++)
                free (diagonaly[i]);
            free(diagonaly);
            
            for (int i = 0; i < rMaska; i++)
                free (maska[i]);
            free(maska);
    free(str);
}