[C] tablice dynamiczne błąd rozmiaru

witam, mógłby mi ktoś wyjaśnić dlaczego gdy przekazuje tablice dynamiczną do funkcji i gdy użyje funkcji sizeof(tablica) i podziele przez sizeof(int) to pokazuje rozmiar 1 ?? sizeof(tablica) / sizeof(int) używam żeby poznać rozmiar tablicy, równie dobrze mogę zmienną n przekazać do funkcji ale chcę wiedzieć dlaczego ten sposób nie działa.

#include 

#include 


void czyszczenieEkranu (void);

void losuj (int tablica[]);


int main (void)

{

  int ile;

  int *tablica;


  czyszczenieEkranu ();

  printf ("program losuje n podanych liczb i zapisuje je do tablicy\n");

  printf ("ile liczb chcesz wylosowac ?? n= ");

  scanf ("%d", &ile);


  tablica = (int *) malloc (ile * sizeof (int));


  losuj (tablica);

  free (tablica);

  return 0;

}


void czyszczenieEkranu (void)

{

  system ("clear");

}


void losuj (int tablica[])

{

  int i;

  int ile = (sizeof (tablica)) / sizeof (int);

  printf ("tablica zawiera miejsca na %d elementow\n", ile);

  srand (time (NULL));


  for (i = 0; i < ile; i++)

    {

      tablica[i] = rand () % 100;

    }


  printf ("elementy w tablicy:\n");

  for (i = 0; i < ile; i++)

    {

      printf ("%d ", tablica[i]);

    }


  printf ("\n");

}

Bo rozmiar tablicy alokowanej dynamicznie nie jest przechowywany w “dostępnym” miejscu, więc przekazujesz tylko wskaźnik(który na systemach 32-bitowych ma 4B czyli sizeof(int)) na zaalokowaną pamięć. Taka specyfika języka.

czyli jedynym sposobem jest przekazanie zmiennej n, aby program działał prawidłowo??

Tak*, jeśli koniecznie chcesz przekazać tablicę.

* - można użyć funkcji, która pobierze rozmiar pamięci, ale wtedy trzeba użyć funkcji specyficznych dla alokatora(czyli w sumie systemu operacyjnego). Dla Windows to będzie jedna z tych:

GlobalSize, HeapSize, LocalSize

próbowałem również przekazać adres tablicy a później za pomocą “*” dobrać się do tablicy ale to też nic nie daje bo wskazuje na pierwszy element a nie na całą tablice

Ale czy przekażesz tablicę jako int[] czy jako int* to bez różnicy - i tak będzie wskazywać na pierwszy element.

wiem właśnie, tylko nie wiedziałem że w przypadku tablic dynamicznych tak to działa, poszukam odpowiedników funkcji pod linux-a o których pisałeś

Poczytaj: http://forum.warsztat.gd/index.php?topi … #msg283788

Ale ogólnie to nie jest najlepszy pomysł, lepiej przekazać ilość obiektów ręcznie.