Zajęcia 9 - Dynamiczny przydział pamięci

#include <stdlib.h>

void *malloc(size_t rozmiar);
void free(void *wskaznik);
  
void *realloc(void *wskaznik, size_t rozmiar);
void *calloc(size_t ile, size_t rozmiar);

Dokładny opis powyższych funkcji na stornie Wikipedii
Funkcje z biblioteki stdlib

Przykład zastosowania funkcji malloc()

#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
}

Ćwiczenia

  • W plikach macierz.h i macierz.c zadeklaruj i zdefiniuj następujące funkcje:
    • utwórz_macierz - argumentami funkcji są rozmiary macierzy, wartością zwracaną jest adres (wskaźnik) dynamicznie utworzonej macierzy typu float (tablica zawierająca wskaźniki typu float) lub NULL gdy tworzenie macierzy się nie powiodło
    • wczytaj_macierz - wstawia do macierzy (argumentami mają być wymiary macierzy oraz odpowiedni wskaźnik do macierzy) wartości wczytane z klawiatury
    • wyświetl_macierz - wyświetla zawartość macierzy na ekranie
    • zwolnij_macierz - zwalnia pamięć zajętą przez macierz
    • dodaj_macierze - wykonuje operację dodawania dwóch macierzy (o odpowiednich rozmiarach). Wartością zwracaną jest adres (wskaźnik) nowej macierzy zawierającej rezultat dodawania
  • wykorzystując powyższe funkcje napisz program, który wczyta z klawiatury dwie macierze o podanym przez użytkownika rozmiarze a następnie wyświetli sumę tych macierzy
  1. do programu z ćwiczeń dopisz funkcję iloczyn, która wykonuje morzenie dwóch macierzy. Funkcja zwraca adres macierzy zawierającej wynik operacji mnożenia lub wartość NULL gdy podane macierze miały nieodpowiedni rozmiar
  2. przekształć bazę danych osobowych z poprzednich zajęć tak aby tablica zawierająca struktury była przydzielana dynamicznie. Na tworzymy bazę mogącą pomieścić 10 wpisów a przypadku gdy tablica zostanie całkowicie wypełniona zwiększamy jej rozmiar dwukrotnie (za pomocą funkcji realloc)