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łkowite w i k 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 lub NULL, gdy tworzenie macierzy się nie powiodło

wczytaj_macierz - wypełnia macierz wartościami podanymi przez użytkownika
Argumenty: rozmiary macierzy w i k oraz adres macierz do wypełnienia
Wartość zwracana: adres wypełnionej macierzy

wyświetl_macierz - wyświetla macierz na ekranie
Argumenty: rozmiary macierzy w i k oraz adres macierz m
Wartość zwracana: brak

zwolnij_macierz - zwalnia pamięć zajętą przez macierz
Argumenty: ilość wierszy macierzy w oraz adres macierzy m
Wartość zwracana: brak

iloczyn_macierzy - wykonuje operację mnożenia dwóch macierzy o odpowiednich rozmiarach.
Argumenty: rozmiary macierzy macierzy pierwszej w1 i k1 oraz adres macierzy pierwszej m1 oraz rozmiary i adres macierzy drugiej w2, k2, m2
Wartość zwracana: adres macierzy o wymiarach w1 na k2 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 biblioteki stdlib.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