8 - Dynamicky alokovaná pole

Procvičovaná témata

  • malloc, calloc, free,
  • pointer,
  • 2D pole

Teoretická příprava

Řešené příklady

Valgrind

Valgrind je nástroj pro analýzu paměti za běhu programu. Lze ho využít na zjištění dvou základních problémů: porovnávání neinicializovaných proměnných a nesprávná práce s dynamickou pamětí.

Instalaci Valgrindu na Windows doporučujeme ve spojení s Windows Linux Subsystem, kde návod najdete v sekci návody Linux konzole pro Windows 10 s propojením VS Code pomocí rozšíření Remote - WSL

Co je špatně na následujícím kódu?

#include <stdio.h>
 
int main (void)
{
        int a;
 
        printf ("%s\n", (!a) ? "nula" : "nenula");
 
        return 0;
}

Vyzkoušejte spuštění ve Valgrindu a podívejte na výsledek:

$ gcc -g program.c -o program
$ valgrind ./program

Jak se změní výstup Valgrindu pokud při definici proměnné použijeme modifikátor static? Proč?

V druhém příkladu se pokusíme do pole alokovaného v dynamické paměti načíst řetězec, který je delší než velikost pole.

#include <stdio.h>
#include <stdlib.h>
 
int main ()
{
        char *a = malloc(4);
        scanf ("%s", a);
        free (a);
        return 0;
}

Ověříme výstup Valgrindu:

$ echo ahoj > data.in
$ gcc -g program.c -o program
$ valgrind ./program < data.in

Jak se změní výstup Valgrindu, když nebude v kódu uvolnění paměti pomocí funkce free?

Nebo další možnost kontroly jako v BRUTE, kde program Vám řekne i čísla řádků, kde se případné úniky vyskytují.

$ valgrind –max-stackframe=1000000000 –leak-check=full –error-exitcode=191 ./program < data.in 

Úkoly na cvičení

  1. Napište program, který zpracuje posloupnost reálných čísel zadaných na standardním vstupu
    • Posloupnost bude uložena v poli alokovaném v dynamické paměti
    • Velikost pole je prvním číslem na standardním vstupu
    • Napište funkci, která vypočte směrodatnou odchylku z prvků zadaného pole.
    • Společně s cvičícím si předveďte použití Valgrindu pro diagnostiku přístupů do paměti a správné alokace.
    • Aplikujte funkce pro výpis a výpočet směrodatné odchylky na pole získané načítací funkcí. Nezapomeňte na dealokaci pole při ukončení programu!
  2. Upravte předchozí program tak, aby byla schopna načíst libovolnou posloupnost reálných čísel do pole ukončenou vhodnou zarážkou nebo lépe pomocí EOF, umí-li to vaše konzole.

Další úkoly

  1. Upravte předchozí program tak, aby bylo možné načíst od uživatele více datových řad a pro každou zvlášť spočítat směrodatnou odchylku. Jednoduše to zařídíte tak, že vytvoříte dvourozměrné pole, které ale může mít různé délky řádků. Nezapomeňte zajistit i dealoakaci celého pole!
  2. Napište program, který seřadí načtené pole pomocí metody bubble sort.
courses/b0b99prpa/labs/lab08.txt · Last modified: 2021/12/01 20:15 by nentvond