2010-04-08 12 views
5

Szybkie pytanie c: Jak poznać długość znaku * foo []?Jak uzyskać długość char **?

Dzięki.

+4

jest zakończone nul –

+2

'char ** foo' nie jest tożsame z' char * foo [] 'http://stackoverflow.com/questions/2448204/why-does-this-generate-a-segmentation-fault/2448255 # 2448255 –

+0

Pytanie nie ma sensu bez kontekstu. 'char * foo []' może oznaczać zupełnie różne rzeczy w różnych kontekstach. – AnT

Odpowiedz

11

Nie możesz. Nie bez wiedzy o tym, co znajduje się wewnątrz wskaźników, lub przechowywania tych danych z wyprzedzeniem.

+3

+1, ale zastanawiam się, ile reinkarnacji tego pytania zostanie udzielonych bez wskazania licznych duplikatów. –

6

Masz na myśli liczbę ciągów w tablicy?

Jeśli tablica została przydzielona na stosie w tym samym bloku, można użyć sztuczki sizeof(foo)/sizeof(foo[0]).

const char *foo[] = { "abc", "def" }; 
const size_t length = sizeof(foo)/sizeof(foo[0]); 

Jeśli mówisz o argv przeszedł do głównego, można spojrzeć na parametrze argc.

Jeśli tablica została przydzielona na stercie lub przekazana do funkcji (gdzie rozpadnie się na wskaźnik), nie masz szczęścia, chyba że ktoś, kto go przydzielił, również przekazał ci rozmiar.

2

Jeśli tablica jest statycznie przydzielona, ​​można użyć funkcji sizeof(). Tak więc zadziałałby sizeof(foo)/sizeof(char *). Jeśli tablica została utworzona dynamicznie, masz kłopoty! Długość takiej tablicy normalnie byłaby jawnie przechowywana.

EDYCJA: janków ma oczywiście rację, sizeof jest operatorem.

Warto również zauważyć, że C99 nie pozwala na sizeof na tablicach o zmiennych rozmiarach. Jednak różne kompilatory implementują różne części C99, więc pewna ostrożność jest uzasadniona.

+0

sizeof jest operatorem, a nie funkcją. Używanie sizeof na wyrażeniu (w przeciwieństwie do nazwy typu) nie wymaga nawet nawiasów klamrowych. – janks

Powiązane problemy