Mam do wczytania macierz z pliku i policzenie wyznacznika, mam posłużyć się też dynamiczną alokacją pamięci i użyłem valgrinda do sprawdzenia czy pamięć jest poprawnie zwalniana i okazało się, ze nie do końca. Co pominąłem?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void matrix_free(int*** matrix, int s);
int det(int** matrix, int s);
int** alloc(int s);
int main()
{
int i,j,liczba,size, sum;
int** matrix;
FILE* f;
f = fopen("matrix.txt", "r");
if (f == NULL) {
printf("Blad otwarcia pliku liczby.txt\n");
return 1;
}
printf("Pomyslnie wczytano macierz\n");
fscanf(f, "%d", &size);
printf("Rozmiar tablicy to: %d\n", size);
matrix = alloc(size);
printf("Macierz zostala wypelniona zerami: \n");
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
printf("%i\t", matrix[i][j]);
}
printf("\n");
}
printf("Sizeof matrix: %li \n", sizeof(matrix));
printf("Rozmiar macierzy: %i \n", size);
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
fscanf(f, "%i", &liczba);
matrix[i][j] = liczba;
printf("%i\t", liczba);
}
printf("\n");
}
printf("Macierz zostala wypelniona: \n");
for (i = 0; i < size; i++) {
for (j = 0; j < size; j++) {
}
}
printf("Wyznacznik: %d \n", sum = det(matrix, size));
matrix_free(&matrix, size);
return 0;
}
void matrix_free(int*** matrix, int s)
{
int** m = *matrix;
int i;
for(i = 0; i < s; i++)
{
free(m[i]);
}
free(m);
*matrix = NULL;
}
int det(int** matrix, int s)
{
int i = 0, j = 0, sum = 0;
if(s == 1)
return sum = matrix[i][j];
if(s == 2)
return sum = matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
else
return 55;
}
int** alloc(int s)
{
int** matrix;
int i;
matrix = (int**)malloc(s * sizeof(int*));
for (i = 0; i < s; i++)
{
matrix[i] = calloc(s, sizeof(int));
}
Valgrind:
HEAP SUMMARY:
==2792== in use at exit: 552 bytes in 1 blocks
==2792== total heap usage: 7 allocs, 6 frees, 5,732 bytes allocated
==2792==
==2792== LEAK SUMMARY:
==2792== definitely lost: 0 bytes in 0 blocks
==2792== indirectly lost: 0 bytes in 0 blocks
==2792== possibly lost: 0 bytes in 0 blocks
==2792== still reachable: 552 bytes in 1 blocks
==2792== suppressed: 0 bytes in 0 blocks