Cześć. Zastanawiam się, czy jest możliwe zadeklarowanie funkcji przyjmującej jako argument wskaźnik do danego typu danych, a która by dynamicznie alokowała pewną ilość pamięci i adres tego obszaru zapisywała w zmiennej będącej argumentem? Innymi słowy podany wskaźnik stawał by się wskaźnikiem do zaalokowanej tablicy.
Myślę, że musiałaby przyjmować wskaźnik na wskaźnik, ale poza tym jak najbardziej.
Dokładnie tak.
#include
#include
void alokacja(int **tab, size_t ile) {
*tab = (int*) malloc(ile * sizeof(int));
}
int main(void) {
int *tab;
size_t i, max;
scanf("%u", &max);
alokacja(&tab, max);
for(i=0; i
tab[i] = max - i;
for(i=0; i
printf("%d\n", tab[i]);
free(tab);
return 0;
}
Rzeczywiście dorzucenie wskaźnika zadziałało, nie mogłem dojść przyczyny. Bardzo dziękuję za informacje : D
Domyślam się, że próbowałeś zrobić coś takiego:
#include
void alokacja(int *tab_lok, size_t ile) {
tab_lok = (int*) malloc(ile * sizeof(int));
}
int main(void) {
int *tab_main;
alokacja(tab_main, 5);
free(tab_main);
return 0;
}
To nie działa, ponieważ wewnątrz funkcji alokacja tab_lok jest lokalną kopią wskaźnika tab_main. Wskaźnik zwrócony przez malloc jest zapisywany do tab_lok, co nie ma żadnego wpływu na tab_main. Dlatego potrzebny jest wskaźnik na tab_main, żeby móc go zmodyfikować.
Istotnie, tak mniej więcej wyglądała moja funkcja zanim tu napisałem. Teraz jasne jest, że by funkcja edytowała zmienną z programu, musi otrzymać jej wskaźnik, więc jeśli funkcja powinna edytować wskaźnik, powinna otrzymać wskaźnik na ów wskaźnik. Wszystko jasne
– Dodane 03.12.2011 (So) 17:50 –
BUMP.
Co z funkcją usuwającą dynamiczną tablicę? Niech to będzie tablica dwuwymiarowa o zadanym wymiarze pierwszym.
int usun_tablice(char ***tab, int liczba_wierszy)
{
int i;
for(i = 0; i < liczba_wierszy; i++)
free(*(*tab + i));
free(*tab);
return 0;
}
char **tablica;
int x, y, i;
int main(void)
{
x = 5;
// deklaracja tablicy o x elementach
// zawierajacych tablice innych elementow
tablica = (char **)malloc(x);
for(i = 0; i < x; i++)
*tablica = (char *)malloc(y);
usun_tablice(&tablica, x);
return 0;
}