User Tools

Site Tools


dydaktyka:cprog:2016:dynamic_memory_allocation-solutions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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. 
dydaktyka/cprog/2016/dynamic_memory_allocation-solutions.1484571706.txt.gz · Last modified: 2020/03/25 11:46 (external edit)