2013-02-21 14 views
10

Moje pytanie brzmi, jak dokładnie zachowuje się sizeof(), gdy przekazany argument jest tablicą o zmiennej długości z dynamiczną tablicą .Zachowanie sizeof na tablicach o zmiennej długości (tylko C)

Rozważmy przykład:

int fun(int num_of_chars) 
{ 
    char name_arr[num_of_chars] = {0}; 

    /* Do something*/ 

    return sizeof(name_arr); 
} 

W tym przykładzie jest to oczywiste, że wartość zwracana nie jest stałą czasu kompilacji. Ponieważ rozmiar zależy od wartości czasu wykonywania num_of_chars.

cytat z normą C99 (6.5.3.4)

Operator sizeof otrzymuje się wielkość (w bajtach) jej argumentu operacji, który może być ekspresja lub nawiasach nazwa typu. Rozmiar jest określany na podstawie argumentu operandu . Wynikiem jest liczba całkowita. Jeśli typ operandu jest zmiennym typem zmiennej długości , operand jest oceniany; w przeciwnym razie argument nie zostanie oceniony, a wynik będzie stałą całkowitą.

Co mogę zrozumieć z [.... operand jest oceniana ....] jest to, że gdy argument przekazany do sizeof() jest dynamiczna tablica zmiennej długości tablicą, sizeof() „zachowuje się jak” a funkcja, a nie jako operator.

Czy moje zrozumienie jest właściwe?

+0

'sizeof()' jest nadal operatorem; po prostu nie generuje stałej kompilacji, gdy argumentem jest tablica o zmiennej długości. –

+0

Czy Twój kod się kompiluje? Dostaję "obiekt o zmiennej wielkości może nie być zainicjalizowany" błąd –

Odpowiedz

6

Nadal zachowuje się jak operator. Cast jest również operatorem, a także ocenia jego argumenty, podobnie jak * lub &. Bycie operatorem to kategoria składniowa. To się nie zmienia.

Ważnym wyróżnieniem jest to, że zachowuje się jak wyrażenie podczas gdy w innych przypadkach zachowuje się jak stałej.


Aktualizacja: I skomentował poniżej, że nie widzę, dlaczego ocena czyni różnicę, ale teraz zdałem sobie sprawę, istnieją dwa sposobów można pisać sizeof o zmiennej długości tablicy. Albo można przekazać zmienną zadeklarowaną jako zmiennej tablicy Długość:

int a[x]; 
sizeof(a) 

w takim przypadku oceny a rzeczywiście nie ma znaczenia. Ale można też użyć typ jako argumentu, który byłby

sizeof(int[x]) 

iw tym przypadku wynik jest x * sizeof(int) i x muszą zostać ocenione. Który przypuszczam, dlaczego specyfikacja wspomina to.

+0

", a także ocenia jego argument" - nie, nie robi. Wyrażenie przekazane do 'sizeof()' nie jest oceniane. –

+1

@ H2CO3: Proszę przeczytać pytanie. Podaje standardową informację mówiącą, że operand jest oceniany, jeśli jest tablicą o zmiennej długości. To powiedziawszy, jedyne wyrażenie typu tablicy o zmiennej długości w C99 jest tak deklarowaną zmienną i ewaluacyjną, która nie ma zauważalnego efektu, więc nie jestem pewien, dlaczego dokonano rozróżnienia (C++ to inna sprawa, ale nawet C++ 11 nie zawiera tego cecha). –

+1

@ H2CO3: W rzeczywistości zdałem sobie sprawę, że kiedy przekazujesz tablicę o zmiennej długości _type_ do 'sizeof', wyrażenie jest oceniane i z możliwymi do zaobserwowania efektami ubocznymi. Zaktualizowano odpowiedź. –

4

Moje pytanie brzmi, jak dokładnie sizeof() zachowuje się, gdy przekazany argument jest tablicą dynamiczną.

  1. Cóż, raczej oznaczało "o zmiennej długości tablicy" (VLA).

  2. Zachowuje się prawie dokładnie tak samo: zwraca rozmiar tablicy w bajtach.

sizeof() zachowuje się jak "funkcję, a nie jako operatora.

Nie, nigdy nie była funkcją. Jedyną rzeczą, która się zmienia, jest to, że jeśli jest używany na VLA, operator ten nie daje stałej kompilacji, w przeciwnym razie robi.

+0

Powód upadku? –

+1

Ponieważ niektóre ludy są sfrustrowani. –

Powiązane problemy