8 - Dynamicky alokovaná pole + Test

Procvičovaná témata

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

Příprava

Instalace nástroje pro správu paměti, viz sekce Správa dynamické paměti

Řešené příklady

Nástroje pro kontrolu

Nástroj Valgrind je určený pro analýzu paměti za běhu programu v OS Linux. 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 Instalace Ubuntu na Windows 10/11 + WSL s propojením VS Code pomocí rozšíření Remote - WSL

Pro správu dynamické paměti nativně pro OS Windows lze využít programu Dr. Memory či jiného obdobného nástroje, na macOS potom např. programu Leaks. Všechny návody najdete v sekci Správa dynamické paměti.

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: 2025/09/25 13:56 by nentvond