Dynamiczny przydział pamięci
Funkcja malloc() i free()
Funkcja malloc
alokuje pamięć zaś funkcja free
pozwala zwolnić przydzieloną pamięć.
Funkcje te zadeklarowane są w pliku stdlib.h
#include <stdlib.h> void *malloc(size_t rozmiar); void free(void *wskaznik);
Funkcja malloc
alokuje pamięć o padanym rozmiarze (w bajtach). Np. tablica 100 liczb całkowitych potrzebuje sizeof(int)*100
bajtów.
Wartością zwracaną jest adres początku zaalokowanej pamięci, który należy zrzutować na wskaźnik do odpowiedniego typu.
int *x = (int*)malloc(100*sizeof(int));
Jeżeli operacja alokacji pamięci się nie powiodła zwracana jest wartość NULL
(adres 0)
Przykład
#include <stdio.h> #include <stdlib.h> int main() { float stab[10]; float *dtab; int n,i; printf("Podaj rozmiar :"); scanf("%d",&n); dtab = (float *) malloc(n * sizeof(float)); if(dtab == NULL) { printf("Blad przydzialu pamieci\n"); exit(1); } for(i=0;i<n;i++) { *(dtab+i) = rand()/(RAND_MAX + 1.0); *(stab+i) = dtab[i]; // Blad gdy n > 10 } while(--n >= 0) printf("%.4f %.4f\n",dtab[n],stab[n]); free(dtab); // free(stab); !!! Blad }
Plik źródłowy: malloc.c
Zadanie - Dane z pliku
Napisz program, który posortuje liczby rzeczywiste umieszczone w pliku dane.txt
.
Plik może zawierać dowolną ilość liczb rzeczywistych oddzielonych białymi znakami. Liczby powinny zostać umieszczone w tablicy o takim rozmiarze aby pomieścić wszystkie liczby z pliku.
Dane: plik tekstowy dane.txt
Wynik: ciąg liczb w kolejności od najmniejszej do największej
Algorytm sortowania umieść w stosownej funkcji.
Zadanie - Macierz
Zaimplementuj program, który wykona mnożenie dwóch macierzy. W tym celu zaimplementuj następujące funkcje:
utworz_macierz
- tworzy macierz o zadanych rozmiarach
Argumenty: dwie liczby całkowitew
ik
określające ilość wierszy i ilość kolumn macierzy. Macierz tworzona jest dynamicznie wg. struktury podanej na poniższym rysunku.
Wartość zwracana: adres (wskaźnik) macierzy lubNULL
, gdy tworzenie macierzy się nie powiodłowczytaj_macierz
- wypełnia macierz wartościami podanymi przez użytkownika
Argumenty: rozmiary macierzyw
ik
oraz adres macierz do wypełnienia
Wartość zwracana: adres wypełnionej macierzy
wyświetl_macierz
- wyświetla macierz na ekranie
Argumenty: rozmiary macierzyw
ik
oraz adres macierzm
Wartość zwracana: brak
zwolnij_macierz
- zwalnia pamięć zajętą przez macierz
Argumenty: ilość wierszy macierzyw
oraz adres macierzym
Wartość zwracana: brak
iloczyn_macierzy
- wykonuje operację mnożenia dwóch macierzy o odpowiednich rozmiarach.
Argumenty: rozmiary macierzy macierzy pierwszejw1
ik1
oraz adres macierzy pierwszejm1
oraz rozmiary i adres macierzy drugiejw2
,k2
,m2
Wartość zwracana: adres macierzy o wymiarachw1
nak2
stanowiącej iloczyn macierzy pierwszej i drugiej lub wartośćNULL
, gdy nie udało się pomnozyc macierzy (np. niezgodne wymiary lub bład alokacji pamięci)
Struktura alokacji pamięci dla macierzy
Zadania domowe
- W programie sortującym liczby z pliku wykorzystaj funkcję
qsort
z bibliotekistdlib.h
lub zaimplementuj własną wersję algorytmu Quick sort - Do programu wyznaczającego iloczyn macierzy dodaj następujące funkcjonalności:
- program pozwala na zapisanie macierzy wynikowej do pliku tekstowego
- program pozwala na wczytanie dwóch macierzy z plików tekstowych po czym wykonuje na nich operacje mnożenia