-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
9 changed files
with
748 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
summary: Cvičenie 8 Dynamic Allocation | ||
id: cvicenie-8 | ||
categories: cvicenie | ||
tags: beginner | ||
status: Published | ||
authors: Milan Mladoniczky | ||
feedback link: https://github.com/interes-group/pevs-BIAX10029-codelabs/issues | ||
|
||
# Cvičenie 8 - Dynamická alokácia pamäte | ||
|
||
<!-- ------------------------ --> | ||
## Úvod | ||
|
||
Náplňou tohto cvičenie je oboznámiť sa s dynamickou alokáciou pamäte a práce s pointrami. | ||
|
||
Pri vypracovaní cvičení si je potrebné uvedomiť s akými typmi a akú veľkosť pamäte si program alokuje. | ||
|
||
### Obsah | ||
- alokácia dynamického pola | ||
- realokácia existujúceho bloku pamäte | ||
|
||
|
||
> aside negative | ||
> Ak používate ako vývojové prostredie lokálny a editor a následnú kompiláciu cez terminál. Použite príkaz: | ||
> ```shell | ||
> gcc -std=c11 -o program -Wall -Wextra main.c | ||
> ``` | ||
Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové prostredie (VS Code, CLion a pod.) a kompilátor jazyka C. | ||
> aside negative | ||
> Nezabudnite každú alokovanú pamäť uvoľniť volaním funkcie `free` ! Je dôležité si po sebe vždy upratať. | ||
Riešenia na jednotlivé úlohy budú uverejnené neskôr. | ||
<!-- ------------------------ --> | ||
## Úloha 8.1 | ||
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý vypýta na vstupe od používateľa číslo `int n` | ||
a následne alokuje pamäť _n_ blokov každý o veľkosti typu _int_. | ||
Po alokácií program vypíše jednotlivé hodnoty čísle v alokovanej pamäti. | ||
<!-- ------------------------ --> | ||
## Úloha 8.2 | ||
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej pamäte zapíšte | ||
čísla od 1 do _n_. | ||
Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou. | ||
### Príklady vstupov / výstupov programu | ||
Pre vstup 3 bude výpis vyzerať nasledovne: | ||
```text | ||
Adresa alokovanej pamäte: 0x0000475d21a | ||
0. položka: adresa = 0x0000475d21a ; hodnota = 1 | ||
1. položka: adresa = 0x0000475d21b ; hodnota = 2 | ||
2. položka: adresa = 0x0000475d21c ; hodnota = 3 | ||
``` | ||
<!-- ------------------------ --> | ||
## Úloha 8.3 | ||
|
||
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej program | ||
postupne vyžiada od používateľa jednotlivé čísla ako prvky dynamického poľa. | ||
|
||
Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou. | ||
|
||
### Príklady vstupov / výstupov programu | ||
|
||
Priebeh programu môže byť nasledovný: | ||
|
||
```text | ||
Zadajte počet prvkov: 3 | ||
Zadanie 1. prvok: 85 | ||
Zadanie 2. prvok: 41 | ||
Zadanie 3. prvok: -2 | ||
Adresa alokovanej pamäte: 0x000784b111 | ||
0. položka: adresa = 0x000784b111 ; hodnota = 85 | ||
1. položka: adresa = 0x000784b112 ; hodnota = 41 | ||
2. položka: adresa = 0x000784b113 ; hodnota = -2 | ||
``` | ||
|
||
|
||
<!-- ------------------------ --> | ||
## Úloha 8.4 | ||
|
||
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý načíta od používateľa počet slov `int n` (_n_ je zadané od používateľa) | ||
a ich maximálnu dĺžku `int maxLen`. Následne program dynamicky alokuje pole reťazcov. Pre každé slovo alokuje novú dynamickú pamäť pre samotný reťazec | ||
ako prvok poľa. Slovo má maximálne dĺžku definovanú používateľom. | ||
|
||
Program postupne od používateľa načíta _n_ slov. Po načítaní všetkách slov vypíše načítané slová a ich dĺžky. | ||
|
||
> aside positive | ||
> Pre získanie dĺžky reťazcov je možné použiť funkciu `strlen` z knižnice `<string.h>` | ||
### Príklady vstupov / výstupov programu | ||
|
||
Priebeh programu môže byť nasledovný: | ||
|
||
```text | ||
Zadajte počet slov: 3 | ||
Zadajte maximálnu dĺžku slova: 10 | ||
Zadajte slová: | ||
ahoj | ||
programovanie | ||
C | ||
--- | ||
Slová a ich dĺžky: | ||
ahoj (4 znaky) | ||
programovanie (13 znakov) | ||
C (1 znak) | ||
``` | ||
|
||
|
||
<!-- ------------------------ --> | ||
## Úloha 8.5 | ||
|
||
Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý na začiatku alokuje pamäť o veľkosti 5 čísel | ||
(t.j. pole veľkosti `5*sizeof(int)`). Následne umožní používateľovi pridávať hodnoty to poľa zo štandardného vstupu. | ||
Ak sa pole naplní, zmeňte jeho alokovanú veľkosť na dvojnásobnú aktuálnej veľkosti a umožnite používateľa ďalej zadávať čísla. | ||
Pokračujte načítanie hodnôt pokým používateľ nezadá hodnotu **-1**, ktorý ukonči zadávanie čísel. | ||
|
||
Na záver, program vypíše všetky načítané čísla, veľkosť a adresu alokovanej pamäte. | ||
|
||
Nezabudnite patrične uvoľniť alokovanú pamäť a ošetriť prípady keď alokácia pamäte zlyhá. | ||
|
||
### Príklady vstupov / výstupov programu | ||
|
||
Priebeh programu môže byť nasledovný: | ||
|
||
```text | ||
Zadajte hodnoty (zadaním -1 ukončíte): | ||
10 | ||
20 | ||
30 | ||
40 | ||
50 | ||
60 | ||
70 | ||
-1 | ||
--- | ||
Zadané hodnoty: 10 20 30 40 50 60 70 | ||
Konečná veľkosť poľa: 10 prvkov | ||
Adresa poľa: 0x000044781dcc | ||
``` | ||
|
||
|
||
<!-- ------------------------ --> | ||
## Úloha 8.6 | ||
|
||
Majme nasledujúci program: | ||
|
||
```C | ||
void runMe(){ | ||
int* leakingPtr = (int*) malloc(sizeof(int)*1024); | ||
for(int i=0;i<1024;i++){ | ||
leakingPtr[i] = i+1000; | ||
} | ||
} | ||
|
||
int main(){ | ||
runMe(); | ||
return 0; | ||
} | ||
``` | ||
|
||
1. Ako vyzerá alokovaná pamäť program pred a po volaní funkcie `runMe`? | ||
2. Čo je zlé s funkciou `runMe`? (minimálne 2 veci) | ||
3. Prepíšte program tak aby bol korektný. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
{ | ||
"environment": "web", | ||
"format": "html", | ||
"prefix": "https://storage.googleapis.com", | ||
"mainga": "", | ||
"updated": "2024-11-20T00:29:55+01:00", | ||
"id": "cvicenie-8", | ||
"duration": 0, | ||
"title": "Cvičenie 8 - Dynamická alokácia pamäte", | ||
"authors": "Milan Mladoniczky", | ||
"summary": "Cvičenie 8 Dynamic Allocation", | ||
"source": "cvicenie-8.md", | ||
"theme": "", | ||
"status": [ | ||
"published" | ||
], | ||
"category": [ | ||
"cvicenie" | ||
], | ||
"tags": [ | ||
"beginner" | ||
], | ||
"feedback": "https://github.com/interes-group/pevs-BIAX10029-codelabs/issues", | ||
"url": "cvicenie-8" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
|
||
<!doctype html> | ||
|
||
<html> | ||
<head> | ||
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> | ||
<meta name="theme-color" content="#4F7DC9"> | ||
<meta charset="UTF-8"> | ||
<title>Cvičenie 8 - Dynamická alokácia pamäte</title> | ||
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Source+Code+Pro:400|Roboto:400,300,400italic,500,700|Roboto+Mono"> | ||
<link rel="stylesheet" href="//fonts.googleapis.com/icon?family=Material+Icons"> | ||
<link rel="stylesheet" href="https://storage.googleapis.com/claat-public/codelab-elements.css"> | ||
<style> | ||
.success { | ||
color: #1e8e3e; | ||
} | ||
.error { | ||
color: red; | ||
} | ||
</style> | ||
</head> | ||
<body> | ||
<google-codelab codelab-gaid="" | ||
codelab-ga4id="" | ||
id="cvicenie-8" | ||
title="Cvičenie 8 - Dynamická alokácia pamäte" | ||
environment="web" | ||
feedback-link="https://github.com/interes-group/pevs-BIAX10029-codelabs/issues"> | ||
|
||
<google-codelab-step label="Úvod" duration="0"> | ||
<p>Náplňou tohto cvičenie je oboznámiť sa s dynamickou alokáciou pamäte a práce s pointrami.</p> | ||
<p>Pri vypracovaní cvičení si je potrebné uvedomiť s akými typmi a akú veľkosť pamäte si program alokuje.</p> | ||
<h2 is-upgraded>Obsah</h2> | ||
<ul> | ||
<li>alokácia dynamického pola</li> | ||
<li>realokácia existujúceho bloku pamäte</li> | ||
</ul> | ||
<aside class="warning"><p> Ak používate ako vývojové prostredie lokálny a editor a následnú kompiláciu cez terminál. Použite príkaz:</p> | ||
<pre><code language="language-shell" class="language-shell">gcc -std=c11 -o program -Wall -Wextra main.c | ||
</code></pre> | ||
</aside> | ||
<p>Pre vypracovanie týchto úloh odporúčam mať funkčné lokálne vývojové prostredie (VS Code, CLion a pod.) a kompilátor jazyka C.</p> | ||
<aside class="warning"><p> Nezabudnite každú alokovanú pamäť uvoľniť volaním funkcie <code>free</code> ! Je dôležité si po sebe vždy upratať.</p> | ||
</aside> | ||
<p>Riešenia na jednotlivé úlohy budú uverejnené neskôr.</p> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.1" duration="0"> | ||
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý vypýta na vstupe od používateľa číslo <code>int n</code> a následne alokuje pamäť <em>n</em> blokov každý o veľkosti typu <em>int</em>.</p> | ||
<p>Po alokácií program vypíše jednotlivé hodnoty čísle v alokovanej pamäti.</p> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.2" duration="0"> | ||
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej pamäte zapíšte čísla od 1 do <em>n</em>.</p> | ||
<p>Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.</p> | ||
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2> | ||
<p>Pre vstup 3 bude výpis vyzerať nasledovne:</p> | ||
<pre><code language="language-text" class="language-text">Adresa alokovanej pamäte: 0x0000475d21a | ||
0. položka: adresa = 0x0000475d21a ; hodnota = 1 | ||
1. položka: adresa = 0x0000475d21b ; hodnota = 2 | ||
2. položka: adresa = 0x0000475d21c ; hodnota = 3 | ||
</code></pre> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.3" duration="0"> | ||
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý nadväzuje na úlohu 8.1. Do alokovanej program postupne vyžiada od používateľa jednotlivé čísla ako prvky dynamického poľa.</p> | ||
<p>Následne program vypíše na štandardný výstup adresu alokovanej pamäte a zároveň jednotlivé zapísané hodnoty aj s ich adresou.</p> | ||
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2> | ||
<p>Priebeh programu môže byť nasledovný:</p> | ||
<pre><code language="language-text" class="language-text">Zadajte počet prvkov: 3 | ||
Zadanie 1. prvok: 85 | ||
Zadanie 2. prvok: 41 | ||
Zadanie 3. prvok: -2 | ||
Adresa alokovanej pamäte: 0x000784b111 | ||
0. položka: adresa = 0x000784b111 ; hodnota = 85 | ||
1. položka: adresa = 0x000784b112 ; hodnota = 41 | ||
2. položka: adresa = 0x000784b113 ; hodnota = -2 | ||
</code></pre> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.4" duration="0"> | ||
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý načíta od používateľa počet slov <code>int n</code> (<em>n</em> je zadané od používateľa) a ich maximálnu dĺžku <code>int maxLen</code>. Následne program dynamicky alokuje pole reťazcov. Pre každé slovo alokuje novú dynamickú pamäť pre samotný reťazec ako prvok poľa. Slovo má maximálne dĺžku definovanú používateľom.</p> | ||
<p>Program postupne od používateľa načíta <em>n</em> slov. Po načítaní všetkách slov vypíše načítané slová a ich dĺžky.</p> | ||
<aside class="special"><p> Pre získanie dĺžky reťazcov je možné použiť funkciu <code>strlen</code> z knižnice <code><string.h></code></p> | ||
</aside> | ||
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2> | ||
<p>Priebeh programu môže byť nasledovný:</p> | ||
<pre><code language="language-text" class="language-text">Zadajte počet slov: 3 | ||
Zadajte maximálnu dĺžku slova: 10 | ||
Zadajte slová: | ||
ahoj | ||
programovanie | ||
C | ||
--- | ||
Slová a ich dĺžky: | ||
ahoj (4 znaky) | ||
programovanie (13 znakov) | ||
C (1 znak) | ||
</code></pre> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.5" duration="0"> | ||
<p>Napíšte program, zdrojový kód, v jazyku C použitím štandardu C11, ktorý na začiatku alokuje pamäť o veľkosti 5 čísel (t.j. pole veľkosti <code>5*sizeof(int)</code>). Následne umožní používateľovi pridávať hodnoty to poľa zo štandardného vstupu. Ak sa pole naplní, zmeňte jeho alokovanú veľkosť na dvojnásobnú aktuálnej veľkosti a umožnite používateľa ďalej zadávať čísla. Pokračujte načítanie hodnôt pokým používateľ nezadá hodnotu <strong>-1</strong>, ktorý ukonči zadávanie čísel.</p> | ||
<p>Na záver, program vypíše všetky načítané čísla, veľkosť a adresu alokovanej pamäte.</p> | ||
<p>Nezabudnite patrične uvoľniť alokovanú pamäť a ošetriť prípady keď alokácia pamäte zlyhá.</p> | ||
<h2 is-upgraded>Príklady vstupov / výstupov programu</h2> | ||
<p>Priebeh programu môže byť nasledovný:</p> | ||
<pre><code language="language-text" class="language-text">Zadajte hodnoty (zadaním -1 ukončíte): | ||
10 | ||
20 | ||
30 | ||
40 | ||
50 | ||
60 | ||
70 | ||
-1 | ||
--- | ||
Zadané hodnoty: 10 20 30 40 50 60 70 | ||
Konečná veľkosť poľa: 10 prvkov | ||
Adresa poľa: 0x000044781dcc | ||
</code></pre> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
<google-codelab-step label="Úloha 8.6" duration="0"> | ||
<p>Majme nasledujúci program:</p> | ||
<pre><code language="language-C" class="language-C">void runMe(){ | ||
int* leakingPtr = (int*) malloc(sizeof(int)*1024); | ||
for(int i=0;i<1024;i++){ | ||
leakingPtr[i] = i+1000; | ||
} | ||
} | ||
|
||
int main(){ | ||
runMe(); | ||
return 0; | ||
} | ||
</code></pre> | ||
<ol type="1"> | ||
<li>Ako vyzerá alokovaná pamäť program pred a po volaní funkcie <code>runMe</code>?</li> | ||
<li>Čo je zlé s funkciou <code>runMe</code>? (minimálne 2 veci)</li> | ||
<li>Prepíšte program tak aby bol korektný.</li> | ||
</ol> | ||
|
||
|
||
</google-codelab-step> | ||
|
||
</google-codelab> | ||
|
||
<script src="https://storage.googleapis.com/claat-public/native-shim.js"></script> | ||
<script src="https://storage.googleapis.com/claat-public/custom-elements.min.js"></script> | ||
<script src="https://storage.googleapis.com/claat-public/prettify.js"></script> | ||
<script src="https://storage.googleapis.com/claat-public/codelab-elements.js"></script> | ||
<script src="//support.google.com/inapp/api.js"></script> | ||
|
||
</body> | ||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.