This shows you the differences between two versions of the page.
dydaktyka:cprog:2016:dynamic_memory_allocation-solutions [2017/01/16 14:01] pkleczek utworzono |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~NOTRANS~~ | ||
- | ====== Dynamiczna alokacja pamięci – rozwiązania ====== | ||
- | |||
- | Laboratorium: **[[dydaktyka:cprog:2016:dynamic_memory_allocation|klik]]** | ||
- | |||
- | ===== Zadanie DAL1D ===== | ||
- | |||
- | <code c dal1.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main () | ||
- | { | ||
- | // rozmiar tablicy | ||
- | int n = 5; | ||
- | |||
- | double* tab; | ||
- | int i; | ||
- | |||
- | // *tab to WARTOSC pierwszego elementu tablicy, | ||
- | // zatem w tym przypadku sizeof(*tab) == sizeof(double) | ||
- | tab = malloc(n * sizeof(*tab)); | ||
- | |||
- | for (i = 0; i < n; i++) { | ||
- | tab[i] = rand() % 101; // liczby losowe z zakresu 0...100 | ||
- | } | ||
- | |||
- | for (i = 0; i < n; i++) { | ||
- | printf("%3d: %.2f\n", i, tab[i]); | ||
- | } | ||
- | |||
- | free(tab); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadanie DAL1DCHG ===== | ||
- | |||
- | <code c dal1dchg.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main () | ||
- | { | ||
- | // rozmiar tablicy | ||
- | int n = 5; | ||
- | |||
- | double* tab; | ||
- | int i; | ||
- | |||
- | // *tab to WARTOSC pierwszego elementu tablicy, | ||
- | // zatem w tym przypadku sizeof(*tab) == sizeof(double) | ||
- | tab = malloc(n * sizeof(*tab)); | ||
- | |||
- | for (i = 0; i < n; i++) { | ||
- | tab[i] = rand() % 101; // liczby losowe z zakresu 0...100 | ||
- | } | ||
- | |||
- | tab = realloc(tab, 2 * n * sizeof(*tab)); | ||
- | for (i = n; i < 2*n; i++) { | ||
- | tab[i] = 0; | ||
- | } | ||
- | |||
- | for (i = 0; i < 2*n; i++) { | ||
- | printf("%3d: %.2f\n", i, tab[i]); | ||
- | } | ||
- | |||
- | free(tab); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadanie DAL2D ===== | ||
- | |||
- | Problem można rozwiązać w następujący sposób, alokując pierwszą tablicę przechowującą adresu każdego z wyrazów, następnie (w pętli) kolejne tablice do przechowywania faktycznych znaków (i wpisywać znaki po jednym, pamiętając o znaku zerowym): | ||
- | <code c dal2d_v1.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | #include <string.h> | ||
- | |||
- | int main () | ||
- | { | ||
- | int i; | ||
- | |||
- | char** str2d = malloc(3 * sizeof(char*)); | ||
- | // | ||
- | str2d[0] = malloc((strlen("Oto") + 1) * sizeof(char)); | ||
- | str2d[0][0] = 'O'; | ||
- | str2d[0][1] = 't'; | ||
- | str2d[0][2] = 'o'; | ||
- | str2d[0][3] = '\0'; | ||
- | // | ||
- | str2d[1] = malloc((strlen("tablica") + 1) * sizeof(char)); | ||
- | str2d[1][0] = 't'; | ||
- | str2d[1][1] = 'a'; | ||
- | str2d[1][2] = 'b'; | ||
- | str2d[1][3] = 'l'; | ||
- | str2d[1][4] = 'i'; | ||
- | str2d[1][5] = 'c'; | ||
- | str2d[1][6] = 'a'; | ||
- | str2d[1][7] = '\0'; | ||
- | // | ||
- | str2d[2] = malloc((strlen("dynamiczna.") + 1) * sizeof(char)); | ||
- | str2d[2][0] = 'd'; | ||
- | str2d[2][1] = 'y'; | ||
- | str2d[2][2] = 'n'; | ||
- | str2d[2][3] = 'a'; | ||
- | str2d[2][4] = 'm'; | ||
- | str2d[2][5] = 'i'; | ||
- | str2d[2][6] = 'c'; | ||
- | str2d[2][7] = 'z'; | ||
- | str2d[2][8] = 'n'; | ||
- | str2d[2][9] = 'a'; | ||
- | str2d[2][9] = '.'; | ||
- | str2d[2][10] = '\0'; | ||
- | |||
- | for (i = 0; i < 3; i++) { | ||
- | printf("%s\n", str2d[i]); | ||
- | } | ||
- | |||
- | // Zwolnienie pamieci przechowujacej poszczegolne litery. | ||
- | for (i = 0; i < 3; i++) { | ||
- | free(str2d[i]); | ||
- | } | ||
- | |||
- | // Zwolnienie pamieci przechowujacej adresy wyrazow. | ||
- | free(str2d); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | Jak widać, jest to rozwiązanie dość mało wygodnie. | ||
- | |||
- | Można jednak wykorzystać mechanizmy języka C i zamiast alokować dynamicznie pamięć dla poszczególnych wyrazów -- po prostu przypisać łańcuch znaków utworzony z użyciem zapisu ''<nowiki>"abc..."</nowiki>'': | ||
- | <code c dal2d_v2.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main () | ||
- | { | ||
- | int i; | ||
- | |||
- | char** str2d = malloc(3 * sizeof(char*)); | ||
- | str2d[0] = "Oto"; | ||
- | str2d[1] = "tablica"; | ||
- | str2d[2] = "dynamiczna."; | ||
- | |||
- | for (i = 0; i < 3; i++) { | ||
- | printf("%s\n", str2d[i]); | ||
- | } | ||
- | |||
- | free(str2d); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | Rozwiązanie staje się krótsze, prostsze i przejrzystsze. |