This is an old revision of the document!
~~NOTRANS~~
Laboratorium: klik
#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; }
#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; }
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):
#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..."
:
#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.