User Tools

Site Tools


dydaktyka:cprog:2016:dynamic_memory_allocation-solutions

This is an old revision of the document!


~~NOTRANS~~

Dynamiczna alokacja pamięci – rozwiązania

Laboratorium: klik

Zadanie DAL1D

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;
}

Zadanie DAL1DCHG

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;
}

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):

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;
}

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 "abc...":

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;
}

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)