2013-06-23 17 views
16

Mam kawałek kodu C, a ja nie rozumiem, jak działa funkcja sizeof(...):wielkość tablicy znaków i wielkości wskaźnika znaków

#include <stdio.h> 

int main(){ 
    const char firstname[] = "bobby"; 
    const char* lastname = "eraserhead"; 
    printf("%lu\n", sizeof(firstname) + sizeof(lastname)); 
    return 0; 
} 

W sizeof powyższy kod (imię) jest 6 i sizeof (nazwisko) to 8.

Ale bobby ma szerokość 5 znaków, a eraserhead ma 11 szerokości. Spodziewam się 16.

Dlaczego sizeof zachowuje się inaczej dla tablicy znaków i wskaźnika dla postaci?

Czy ktoś może wyjaśnić?

+5

Zarówno 'sizeof' jak i' strlen() 'dają wynik typu' size_t'. Użyj '% zu', a nie'% lu', aby wydrukować wartości 'size_t'. Lub, jeśli Twój kompilator nie obsługuje '% zu', przekonwertuj na znany typ i użyj odpowiedniego formatu dla tego typu. –

Odpowiedz

23

firstname to macierz char niosąca końcowe urządzenie końcowe 0. lastname to wskaźnik. W systemie 64-bitowym wskaźniki mają szerokość 8 bajtów.

+0

Jasne jest, że OP próbował ustalić rozmiar ciągu, tj. Długość łańcucha i dodać oba, gdy mówi "dlaczego nie 5 + 10 = 15?" ", Czy naprawdę możliwe jest uzyskanie długości łańcucha przez 'sizeof' lub' strlen() 'jest bardziej odpowiedni? Co mówisz? – 0decimal0

+2

@PHIfounder: As ** "ciąg" w C jest reprezentowany przez sekwencję znaków zakończoną przez znak '' \ 0'' **, użyj 'strlen()', aby uzyskać długość "ciągu znaków". Działa to na "prawdziwych" tablicach znaków, jak również na wskaźnikach wskazujących na te ostatnie. W tym kontekście nie ma podstawowego znaczenia, jak i gdzie przechowywane są znaki. W rzeczywistości zmienna trzymająca ciąg nie musi koniecznie pasować do długości "struny". Jeśli z drugiej strony interesuje się ** ilością bajtów, którą zmienna deklaruje użyć **, użyj operatora 'sizeof'. – alk

+2

A liczba bajtów potrzebna do zapisania ciągu 's' (lub wskazywanego przez' s') to 'strlen (s) + 1'. –

3

Rozmiar pierwszej macierzy to rozmiar bobby\0. \0 to znak terminatora, czyli 6.

Drugi rozmiar to rozmiar wskaźnika, który w systemie 64-bitowym ma 8 bajtów. Jego rozmiar nie zależy od długości przypisanego łańcucha.

6

sizeof tablica jest wielkość ogólnej tablicy, w przypadku „Bobby”, to 5 znaków i jedno końcowe \0 co równa 6.

sizeof wskaźnikiem jest wielkość wskaźnika, który jest zwykle 4 bajty w maszynie 32-bitowej i 8 bajtach w maszynie 64-bitowej.

2

firstname[] ma wartość NULL, która dodaje 1 do długości.

sizeof(lastname) podaje rozmiar wskaźnika zamiast rzeczywistej wartości.

+3

'* lastname' jest pojedynczym' char', więc 'sizeof * lastname' zawsze będzie miało wartość 1. – caf

2

firstname to tablica składająca się z 6 chars, w tym kończącego się znaku '\0' na końcu napisu. Dlatego sizeof firstname jest 6.

lastname jest wskaźnikiem do char, i będzie miał dowolną wielkość takiego wskaźnika na twoim systemie. Typowe wartości to 4 i 8. Rozmiar lastname będzie taki sam, bez względu na to, na co wskazuje (lub nawet jeśli w ogóle nic nie wskazuje).

Powiązane problemy