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