Проблема с перераспределением в C. Я попытался динамически построить вектор, вывод правильный, но valgrind подсказывает мне, что есть проблемы в памяти

#c

#c

Вопрос:

Всем привет, у меня проблема с этим кодом. Я должен вернуть вектор, состоящий из элементов матрицы без повторений (матрица должна считываться двоеточиями). Вывод правильный, но valgrind подсказывает мне, что есть проблемы с памятью. Я попытался динамически построить вектор, добавив новый элемент через перераспределение. Большое спасибо.

 #include<stdio.h>
#include<stdlib.h>

void printa_matrice(int nc, int nr , int ** mat)
{
    int i, j;
    for (i=0; i<nr; i  ){
        for(j=0; j<nc ; j  ){
            printf("(%d)", mat[i][j]);
        }
        puts("");
    }
}

int  its_new(int elem ,int * ptr, int conta)
{
    int new=1;
    int i ;
    for(i=0; i<conta; i  ){
        if(ptr[i]== elem){
            new =0;
        }
    }
    return new;
}
void print_vect(int conta, int * ptr)
{
    int i;
    for (i=0; i<conta; i  ){
        printf("%d, ", ptr[i]);
    }
    puts("");
}

int* matrix_to_vec(int nr, int nc , int ** mat)
{
    int conta=0;
    int *V;
    V= malloc(sizeof(int));
    int i,j;

    for(j=0; j<nc; j  ){
        for(i=0; i<nr; i  ){
            if (its_new(mat[i][j],V,conta ))
            {
                V[conta]= mat[i][j];
                conta=conta 1;
                V= realloc(V,conta* sizeof(int));
            }
        }
    }
    print_vect(conta, V);
    return V;
}

int main()
{
    int nc=3;
    int nr=3;
    int **mat;
    int i ;

    mat=(int **)malloc(nr*sizeof(int*));
    mat[0]=(int *)malloc(nr*nc*sizeof(int));
    for(i=1; i<nr; i  )
    {
        mat[i]= mat[0]   i*nc;
    }

    mat[0][0]=4;
    mat[0][1]=-1;
    mat[0][2]=4;
    mat[1][0]=5;
    mat[1][1]=-1;
    mat[1][2]=5;
    mat[2][0]=4;
    mat[2][1]=4;
    mat[2][2]=0;

    printa_matrice(nc, nr, mat);
    int * headV;
    headV = matrix_to_vec(nr, nc, mat);
    free(mat[0]);
    free(mat);
    free(headV);
    return 0;
}
 

Комментарии:

1. Таким изначально conta=0 и V имеет размер sizeof(int) . После первого realloc , conta=1 и V размер изменился на 1*sizeof(int) , который имеет тот же размер, что и раньше!

2. большое вам спасибо !

Ответ №1:

В matrix_to_vec :

         if (its_new(mat[i][j],V,conta ))
        {
            V[conta]= mat[i][j];
            conta=conta 1;
            V= realloc(V,conta* sizeof(int));
        }
 

При вызове вы realloc не предоставляете достаточно места для нового элемента. conta начинается с 0. Поэтому, когда вы увеличиваете и перераспределяете, conta равно 1, что совпадает с исходным размером.

Поскольку conta это индекс последнего элемента, вы хотите добавить 1 к нему при перераспределении.

             V= realloc(V, (conta 1) * sizeof(int));