[C] Własna funkcja alokująca pamięć dla tablicy

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

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;

}