sizeof() po deklaracji malloc()

0

Jak sprawdzić rozmiar tablicy DYNAMICZNEJ funkcją malloc()?
Wiem, że temat jest często poruszany przejrzałem ich kilkadziesiąt i nikt nie pomógł, lub jest w błędzie, mianowicie:
Po zaalokowaniu pamięci na tablicę, jej rozmiar to po prostu rozmiar samego typu z których składa się tablica, oto przykład:

 
void size(int tab[])
{
	printf("%i parametr\n",sizeof(tab));
}

int main()
{
	int *tab;
	tab=(int *)malloc(10*sizeof(int));
	printf("%i int\n",sizeof(int));
	printf("%i wszystko\n",sizeof(tab));
	size(tab);
	system("pause");
	return 0;
}
 Wynik:
4 int
4 wszystko
4 parametr

I jak sprawdzić rozmiar całej tablicy?
Jak widać sprawdzone przeze mnie sposoby nie działają, każdy rozmiar to 4.

Z góry dziękuję za pomoc, na pewno pomoże to niejednej osobie!

0

Nie ma takiej możliwości. Ale zawsze możesz zapamiętać w dodatkowej zmiennej ile przydzieliłeś.

0

chodzi o to, że do funkcji przekazujesz wskaźnik na pierwszy element. Wskaźnik ma rozmiar 4b. Spójrz na ten przykład.

void size(char tab[])
{
        printf("%i parametr\n",sizeof(tab));
}

int main()
{
        char *tab;
        tab=(char *)malloc(10);
        printf("%i int\n",sizeof(char));
        printf("%i wszystko\n",sizeof(tab));
        size(tab);
        system("pause");
        return 0;
} 

Rozmiar "char" wynosi 1b ... Lecz pokazuje dalej 4. Dlaczego? A no dlatego, iż rozmiar wskaźnika na dowolny typ zawsze równy jest 4b. Mając ten wskaźnik nie określisz rozmiaru tablicy. To działa na takiej samej zasadzie, jakbyś znał jedna osobę w mieście i chciał znać ilość mieszkańców :>

0
gswidwa napisał(a):

Rozmiar "char" wynosi 1b
Nie. sizeof(char) == 1(B) - lecz niekoniecznie jest to równe oktetowi bitów.

gswidwa napisał(a):

A no dlatego, iż rozmiar wskaźnika na dowolny typ zawsze równy jest 4b
Nie zawsze. To zależy od architektury i kompilatora. Ponadto trzeba wyróżnić rodzaje wskaźników ponieważ wskaźniki na funkcje mogą mieć różne rozmiary dlatego też np nie masz przez standard zagwarantowanego, że void* przechowa ci wskaźnik na dowolną funkcję.

Więc nie do końca masz rację.

edit: @adf88
Konwersja wskaźnika na funkcję do void* jest zachowaniem niezdefiniowanym (5.2.10(6) -N3242 albo C n1256 6.3.2.3). Ponoć w praktyce na x86 nie ma to większego znaczenia ale inne architektury do wskaźników na funkcje mogą dołączać dodatkowe informacje - zerknij sobie na ten post.

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