Dynamiczny przydział pamięci

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

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.

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

  1. W programie sortującym liczby z pliku wykorzystaj funkcję qsort z biblioteki stdlib.h lub zaimplementuj własną wersję algorytmu Quick sort
  2. 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