2010-05-05 12 views
24

jak znaleźć rozmiaru tablicy stałoprzecinkowego CJak do wielkości całkowitej tablicy

dowolny sposób dostępne bez przechodzenia przez cały szereg, gdy, aby sprawdzić rozmiar tablicy.

+14

Jak wdrożyć tę tablicę? Zasadniczo albo znasz rozmiar tablicy w O (1) (znany rozmiar), O (N) (zakończone zerem), albo niemożliwy. – kennytm

+0

Zwykle tablice są tworzone jako zmienne statyczne i podczas ich tworzenia trzeba było uzyskać pewną długość. – Jack

+1

@Jack: Dlaczego tablice "zwykle" są statyczne? – sbi

Odpowiedz

72

Jeśli tablica jest globalną, statyczną lub automatyczną zmienną (int array[10];), wówczas działa sizeof(array)/sizeof(array[0]).

Jeśli jest to tablica przydzielona dynamicznie (int* array = malloc(sizeof(int)*10);) lub przekazana jako argument funkcji (void f(int array[])), to nie można znaleźć jej rozmiaru w czasie wykonywania. Będziesz musiał przechowywać gdzieś rozmiar.
Należy pamiętać, że sizeof(array)/sizeof(array[0]) kompiluje się dobrze nawet w przypadku drugiego przypadku, ale w trybie cichym wygeneruje zły wynik.

+0

Być może wspomnieć i wskazać pytanie wyjaśniające rozkład matrycy? Często zadawane pytania –

+1

Dla nowicjuszy C++ przybywających na to pytanie C: [Wszystko, co kiedykolwiek chciałeś wiedzieć o tablicach w C++] (http://stackoverflow.com/q/4810664/140719) w jednym FAQ. – sbi

+0

http://stackoverflow.com/questions/5493281/c-sizeof-a-passed-array – delive

-1
int len=sizeof(array)/sizeof(int); 

Powinien działać.

+2

Nie - w wielu przypadkach to * nie * zadziała. –

+2

Działa, jednak 'site_t len ​​= sizeof (array)/sizeof (array [0]);' jest nieco lepszy (tzn. Nadal działa, gdy typ danych z elementów tablicy został zmieniony –

+4

@Grzegorz: Pokaż nam, jak to działa dla tej tablicy: 'void f (int array []) {site_t len ​​= sizeof (tablica)/sizeof (array [0]);}' – sbi

4

Jeśli tablica jest statyczny przypisany:

size_t size = sizeof(arr)/sizeof(int); 

jeśli tablica jest dynamicznej przydzielona (sterty)

int *arr = malloc(sizeof(int) * size); 

gdzie zmienna wielkość jest wymiarem ARR.

3

_msize(array) w systemie Windows lub Linux w malloc_usable_size(array) powinien pracować dla dynamicznej tablicy

Oba znajdują się w malloc.h i oba zwracają size_t

+1

Są przydatne, ale niezbyt przenośne ... – glglgl

Powiązane problemy