Dwuwymiarowa tablica dynamiczna (ANSI C) (jak przydzielić pamięć?)

0

Potrzebuję utworzyć dynamiczną tablicę dwywymiarową w C.
Widziałem przykłady w których tablica deklarowana była np.:
int **tab;
później przydzialana była pamięć dla pierwszej tablicy:
tab = malloc(wym_a * sizeof(double*);
a następnie w pętli dla wszystkich elementów:
tab[i] = malloc(wym_b * sizeof(double));

Czy przydzielenie w taki sposób:
tab = malloc(wym_a * wym_b * sizeof(double));
będzie błędem (lub spowoduje błędy przy używaniu tablicy) i jaka jest różnica między tą, a poprzednią operacją?

0

możesz utworzyć jednowymiarową tablicę tak jak zrobiłeś to w ostatnim przykładzie, ale odnosząc się do niej, będziesz musiał robić w ten sposób, aby odnieść się do tab[i][j], będziesz musiał napisać *tab[i wym_b + j];**

0

Różnica jest taka, że w pierwszym przypadku alokujesz a-wymiarową tablicę tablic b-wymiarowych, a w drugim przypadku alokujesz tablicę jednowymiarową rozmiaru ab. W drugim wypadku tab musi być typu `int`, bo tylko jeden wymiar jest alokowany.

0

W drugim przykładzie miałem na myśli, że tablicę deklaruję również w sposób
int **tab;
Czy nie jest tak, że niezależnie od sposobu przydzielenia pamięci, będzie to i tak tablice dwuwymiarowa (tablica wskaźników na tablicę wskaźników do double), a sposób przydzielenia pamięci nie ma znaczenia i dostęp do elementów będzie działał tak samo (tab[wym_a][wym_b])?

0

Zdecydowanie nie. Jeśli zrobiłbyś tak:

int** tab;
tab = malloc(dim_a * dim_b * sizeof(int*));

miałbyś tablicę wskaźników na int, z których każdy wskazuje nieprawidłowy adres.

0

Ok, już rozumiem. Dzięki za pomoc :)

0

A ja mam pytanie z innej beczki. Da się w ANSI C stworzyć dynamiczną tablicę nie wiedząc ile będzie w niej elementów?

0

Alokując pamięć musisz podać ile jej alokujesz, więc zawsze taka tablica ma jakąś wielkość. Co najwyżej później możesz zaalokować więcej jeśli domyślna wartość jest za mała.

0

Nie wiem, czy Ciebie dobrze rozumiem, ale chyba bez realokacji Ci się nie uda. Problem dynamicznej tablicy (rozszerzającej się z ilością elementów) można rozwiązać alokując tablicę o jakimś rozmiarze i przy dodawaniu elementów jeżeli jest ich więcej niż rozmiar tablicy to powiększasz tablicę dwukrotnie (tzn. będzie miała dwa razy większy rozmiar) funkcją realloc. Najlepiej jest wskaźnik do tablicy przechowywać w strukturze z rozmiarem tablicy i całą tą strukturę przekazywać do funkcji. Przy powiększaniu tablicy za każdym razem dwukrotnie będziesz miał maksymalnie 3*n kopiowań elementów przy dodaniu n elementów, czyli dodanie elementu na koniec nadal jest zamortyzowanie O(1).

0

A ja mam pytanie z innej beczki. Da się w ANSI C stworzyć dynamiczną tablicę nie wiedząc ile będzie w niej elementów?

oczywiście ;-)

#include <stdlib.h>
#include <time.h>

int main()
{
   int* tab;
   srand(time(0));
   tab = calloc(rand(), sizeof(int));
   /* no, ile przydzielono? */
   free(tab);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0