Witam, chcę stworzyć macierz i zalokować pamięć na macierz typu int**, tylko nie za bardzo wiem jak się za to zabrać, bo próbując zalokować jak na zwykły wskaźnik nie udaje się.
Alokujesz pamięć na wskaźniki na rzędy (albo kolumny, zależy jak na to patrzysz):
int** ptr = malloc(sizeof(int*) * num_rows);
potem dla każdego rzędu (lub kolumny) alokujesz pamięć na dane:
for(int i = 0; i < num_rows; i++)
ptr[i] = malloc(sizeof(int) * num_cols);
#include <stdio.h>
#include <stdlib.h>
int main()
{
size_t size = 10, i = 0, j = 0;
int **array = malloc(size * sizeof(int*));
for(;i < size; ++i)
{
array[i] = malloc(size * sizeof(int));
for(j = 0;j < size; ++j)
{
array[i][j] = i;
printf("%d ", array[i][j]);
}
printf("\n");
free(array[i]);
}
free(array);
return 0;
}
Rozumiem już, dzięki. Teraz jednak mam problem z wpisaniem lub wypisaniem tych liczb do tablicy, ogólnie liczby wczytywane są z pliku .txt i potem chcę je wpisać do tablicy. Dla sprawdzenia wypisuję pierw z pliku a potem z tej nowej tablicy ale coś nie wychodzi, bo na każdej pozycji wypisywany jest ostatni element macierzy z pliku .txt . Tak wygląda po uruchomieniu : A tak kod i nie mogę znaleźć w czym jest błąd czy we wpisie czy wypisaniu:
#include <stdio.h>
#include <stdlib.h>
int read();
int main()
{
read();
return 0;
}
int read()
{
FILE* f;
int liczba, i, j, size;
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);
int** matrix;
matrix = malloc(size * sizeof(int*));
for (i = 0; i < size; i++) {
matrix[i] = malloc(size * sizeof(int));
}
printf("Sizeof matrix: %i \n", sizeof(matrix));
for (; feof(f) == 0;) {
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("%i\t", matrix[i][j] = liczba);
}
printf("\n");
}
fclose(f);
}
Wczytujesz poprawnie, natomiast to wypisywanie jest skopane:
printf("%i\t", matrix[i][j] = liczba);
Wypisujesz ostatnia wczytaną liczbę dodatkowo nadpisując całą macierz nią.
Popraw na:
printf("%i\t", matrix[i][j]);
Dodatkowo na końcu programu musisz zwolnić pamięć, każdemu mallocowi powinna odpowiadać inwokacja free
, np:
for(int i = 0; i < size; i++) {
free(matrix[i]);
}
free(matrix);
I tego int'
w read
bez sensu zwracasz, bo... niczego nie zwracasz i masz UB. Zrób void
. I w ogóle wypadałoby to podzielić na mniejsze funkcje, bo teraz masz taką jedną boską metodę, która robi wszystko.
Rzeczywiście, to matrix [i][j] skopiowałem pewnie z wpisywania, a o zwolnieniu pamiętam tylko piszę po mału i częściami.
No z tym intem to fakt, na początku funkcja miała robić coś innego i zapomniałem zmienić. A z tymi funkcjami to jest to tylko wczytanie i stworzenie tablicy, nowe funkcje miałem zamiar robić dopiero na dodawanie/liczenie wyznacznika itp.
Dzięki za pomoc.