Pokażę Ci, jak zaalokować tablicę 2D o wymiarze NxN. Czytałem, że można tego dokonać w pojedynczym wywołaniu malloc, ale nie jestem na tyle otrzaskany z C - mój sposób na pewno działa, a tamtego to nie próbowałem.
Zwróć uwagę na miejsce alokacji zewnętrznego wymiaru tablicy: spójrz jak obliczona jest ilość pamięci potrzebnej do przechowania każdej z pod-tablic.
I nie bagatelizuj znaczenia zwalniania pamięci!!!
#include <stdlib.h>
#include <stdio.h>
unsigned get_N()
{
// wczytanie N z pliku, gdzie N to liczba wierszy (i kolumn)
// u mnie tylko makieta funkcji
return 4;
}
void clean(double **table, unsigned size)
{
unsigned i;
for(i = 0; i < size; ++i)
{
free(table[i]);
}
free(table);
table = NULL;
}
int main()
{
unsigned N = get_N();
/*
Część alokacyjną umieściłbym dla porządku w jakichś zewnętrznych funkcjach.
Ale jako że ten program ma tylko pokazywać alokację macierzy NxN, to niech
zostanie w main(). ;)
*/
// alokacja odpowiedniej ilości wierszy z rzutowaniem na docelowy typ:
double **table = (double**)malloc(N * sizeof(double*));
if (table == NULL)
{
printf("Blad podczas alokacji tablicy - wymiar zewnetrzny.");
return EXIT_FAILURE;
}
// alokacja każdego wiersza:
unsigned i;
for (i = 0; i < N; ++i)
{
table[i] = (double*)malloc(N * sizeof(double));
if (table[i] == NULL)
{
printf("Blad podczas alokacji tablicy - wymiar wewnetrzny [%d].", i);
clean(table, i); // zwalniamy przydzieloną pamięć (ilość dotąd zaalokowanych wymiarów wynosi i)
return EXIT_FAILURE;
}
}
// ...operacje na macierzy... U mnie też jakieś makietowe, przykładowe.
// zapisanie doń wartości:
unsigned j;
for(i = 0; i < N; ++i)
for(j = 0; j < N; ++j)
{
table[i][j] = i * j;
}
// wydruk zawartości:
for(i = 0; i < N; ++i)
{
for(j = 0; j < N; ++j)
printf("%lf ", table[i][j]);
printf("\n");
}
clean(table, N);
return EXIT_SUCCESS;
}