Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

7 - Dynamicky alokovaná pole

  • pro vyučující: 07

Procvičovaná témata

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

Teoretická příprava

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í.

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?

Ú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/lab07.txt · Last modified: 2019/11/06 23:09 by viteks